ユーザーがいくつかのレコードを更新できるフォームを作成しようとしています。ただし、すべてのフィールドを更新できるわけではないので、フォームに対してモデルを更新するために、(今のところコントローラーで)明示的な処理を実行します。これが私がそれをやろうとしている方法です:
家族モデル:
class Family < ActiveRecord::Base
has_many :people, dependent: :destroy
accepts_nested_attributes_for :people, allow_destroy: true, reject_if: ->(p){p[:name].blank?}
end
コントローラ内
def check
edited_family = Family.new(params[:family])
#compare to the one we have in the db
#update each person as needed/allowed
#save it
end
形:
= form_for current_family, url: check_rsvp_path, method: :post do |f|
= f.fields_for :people do |person_fields|
- if person_fields.object.user_editable
= person_fields.text_field :name, class: "person-label"
- else
%p.person-label= person_fields.object.name
問題は、Family.new(params[:family])
データベースから人々を引き出そうとすることだと思います、そして私はこれを手に入れます:
ActiveRecord::RecordNotFound in RsvpsController#check
Couldn't find Person with ID=7 for Family with ID=
つまり、ネストされたフォームにファミリIDのフィールドを追加していないためです。これは可能だと思いますが、データベースから何かをロードするために実際には必要ないので、むしろそうではありません。必要なデータのパラメータハッシュを自分で掘り下げるだけでこれを回避することもできますが、それはスムーズではありません。paramsハッシュからオブジェクトを作成し、それを操作するのが最も良いようです。
もっと良い方法はありますか?ネストされたオブジェクトを作成するにはどうすればよいですか?