2016-06-21 12 views
1

だから私はスイッチを使用するために、下にレールsimple_formと、この入力を使用しています:変更スイッチ値「0」/「1」の文字列へのRails simple_form

class SwitchInput < SimpleForm::Inputs::Base 
    def input 
    input_html_classes.unshift('fg-line') 
    template.content_tag(:div, class: 'toggle-switch') do 
     template.concat @builder.check_box(attribute_name, input_html_options) 
     template.concat inline_label 
    end 
    end 

    def inline_label 
    template.content_tag(:label, class: 'ts-helper') do 
     template.concat options[:inline_label] 
    end 
    end 
end 

私が作成しようとしていますが入力値を文字列として保存するスイッチ。左(デフォルト)に切り替えると保存される値は「小」になり、スイッチを右に回すと保存される値は「大」になります。

今私はbefore_saveコールバックを経由して「小さい」/「大」として値を保存しています:

private def convert_switch_value 
    if size == '0' 
     self.size = 'small' 
    else 
     self.size = 'large' 
    end 

    return true 
    end 

ユーザーがフォームに戻ったときに、保存された値ではないので、これには問題がありますスイッチで表示されます。スイッチはデータベースに保存されている値に関係なく常にオフになっています。

simple_formを使用して文字列値をデータベースに保存し、フォームに再入力するときに保存された値を表示する方法はありますか?

ありがとうございます!

答えて

0

simple_formで行うことはできますが、保存する前にフォームの値を変更することはsimple_formの懸案事項ではありません。

私の推測では、model.sizeを呼び出して、あなたが実際にそれが'small'または'large'、およびない'0'または'1'を返すことを期待する事例があるということです。その場合は、モデル内のgetterとsetterをオーバーライドするだけでは機能しません。

Try reform gem。これは、モデル値を設定する複数の「方法」がある場合に役立ちます。改革は、フォームレンダラーとモデルの仲介者です。モデルをアタッチしてオブジェクトを改造し、モデルをモデルに渡すのではなく、リフォームオブジェクトをsimple_formに渡します。改革のフォームオブジェクトの中には、すべてのフォーム解析ロジックを入れることができます。ここに例があります:

class YourModelForm < Reform::Form 
    property :size 

    def size # override getter 
    if super == 'small' 
     '0' 
    elsif super == 'large' 
     '1' 
    end 
    end 

    def size=(value) # override setter 
    if value == '0' 
     super('small') 
    elsif value == '1' 
     super('large') 
    end 
    end 
end 
関連する問題