前提・実現したいこと
親モデルの入力フォームから子モデルのカラムを更新したい。
発生している問題・エラーメッセージ
エラーメッセージは出ないです。子モデルが更新されないだけです。
親モデル(1):frame、 子モデル(複数):img 1対nの関係 [frame.rb] #association has_many :imgs accepts_nested_attributes_for :imgs [img.rb] #association belongs_to :frame, optional: true
[frames_controller.rb] def edit @frame = Frame.find(params[:id]) end def update @frame = Frame.find(params[:id]) @frame.update(frame_update_params) end private def frame_update_params params.require(:frame).permit(:page1, imgs_attributes: [:img_in_order, :id]) end
[frames/1/edit.html.erb] <%= form_with(model: @frame, local: true) do |m| %> <%= m.hidden_field :page1, :value => '1' %> <%= m.fields_for :img do |e| %> <%= e.hidden_field :img_in_order, :value => '1', :name =>'img[img_in_order]', :id =>'img_img_in_order' %> <% end %> <%= m.submit "更新" %> <% end %>
試したこと
Railsフォームのnested_attributesを使って、デフォルト値の異なる複数の関連レコードを作成する方法
Rails5.1からのform_withでnested_formを扱う方法
fields_forの上手な使い方
Active Record Nested Attributes
この記事を主に参考にしながら考えました。
CarrierWaveは使わず、imgモデルはimgの方でcreateできるようになっています。
imgのimg_in_orderカラムに値を入れたいだけです。
<%= m.hidden_field :page1, :value => '1' %> ```page1は動きます。 ```ここに言語を入力 <%= e.hidden_field :img_in_order, :value => '1', :name =>'img[img_in_order]', :id =>'img_img_in_order' %>
img_in_orderは全く値が入りません。
本当に欲しいのは:value=>'1'だけなのですが、fields_forで親モデル(frame)と子モデル(img)を紐づけてしまうと、:idや:nameにおかしな値が勝手に入ってしまうので、正しく更新されているframeモデルの方を参考に入れています。
(この値があっても、取ってしまっても、imgの更新はできませんが)
試した事:
binding.pryだと入力フォーム直後でもimgの値が入っていないようです。
紐付けが上手くいっていないのか、fields_forの書き方がダメなのか、気づく部分は直してこの状態です。
補足情報(FW/ツールのバージョンなど)
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
Rails 5.2.2
今のところは以上です。何か進展があれば、コレ以降に加筆していきます。
どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/17 03:15
2019/04/17 05:11