複数のフォーム入力を JSON にして1カラムにまとめるベストプラクティスを教えていただけないでしょうか
以下のように attr_accessor でフォーム内容に対応したハッシュ値を保持して
before_save と after_initialize でハッシュ⇔JSON文字列を変換しようとしたのですが
試行錯誤の末ようやく保存はできたのですがうまく呼び出して再表示できません
モデル
attr_accessor: :title_form after_initialize :set_form private def set_form @title_form = JSON.parse(self.title) # JSON カラムをハッシュに戻す end
ビュー
<% puts f.object %> => インスタンスが表示される <% puts f.object.title_form %> => {"default"=>"test"} というハッシュが入っている <% puts f.object[:title_form] %> => nil <%= f.fields_for :title_form do |f| %> <% puts f.object %> => nil <% f.object.each do |k, v| %> <%= f.label k %><%= f.text_field k %> <% end %>
となって each のところで nil 操作エラーになります
attr_accessor と fields_for は組み合わせて使えないのでしょうか
カラムのJSON文字列を複数の text_field に分解して表示するにはどうすればいいのでしょうか
追記:
serialize :title, JSON
というのをおしえていただいたのでモデルの1行かいただけで
モデル内のコードはすべて不要になったのですが
<% puts f.object %> => インスタンスが表示される <% puts f.object.title %> => {"default"=>"test"} というハッシュが入っている <% puts f.object[:title] %> => {"default"=>"test"} になった!!! <%= f.fields_for :title do |f| %> <% puts f.object %> => でも nil のまま <% f.object.each do |k, v| %> <%= f.label k %><%= f.text_field k %> <% end %>
という状態はあいかわらずです…
外側の f.object.title, f.object[:title] も存在しているのに
<%= f.fields_for :title do |f| %>
の中の f.object が nil になるのはなぜなのでしょうか
fields_for はどのように内側で参照するインスタンスを決めているのでしょうか
単にネストしたパラメータがとんでくるようにしたいだけなのですが
fields_for を使う以外にもネストしたパラメータ空間を作ることはできないでしょうか
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/04/04 03:39