- 更新日: 2015年8月18日
- Rails
Railsのfields_forで異なるモデルを編集するフォームを作成
Rails で2つ以上の種類のモデルのオブジェクトの情報を、1つのフォームで編集して送信したい場合、fields_for メソッドを使うと実現できる。
fields_for – リファレンス – – Railsドキュメント
使い方としては、通常の form_for メソッドの中にネストして fields_for メソッドを書いて、各々異なるオブジェクトを引数として渡すようにする。
— 環境 —
Rails 4.1.6
以下、簡単な例です。
フォームのビュー
form_for の中にネストさせて fields_for を書く。
1 2 3 4 5 6 7 |
<%= form_for(@some_object) do |form| %> <%= form.text_field :name %> <%= fields_for(@other_object) do |other| %> <%= other.text_field :post %> <% end %> <%= form.submit "送信する" %> <% end %> |
コントローラー
SomeController の new メソッドで、それぞれ form_for, fields_for に渡す @some_object, @other_object を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
class SomeController < ApplicationController def new @some_object = SomeModel.new @other_object = OtherModel.new end def create @some_object = SomeModel.new(some_model_params) @other_object = OtherModel.new(other_model_params) if @some_object.save && @other_object.save # save successfully # ... else render 'new' end end # ... private # strong parameters def some_model_params params.require(:some_model).permit( :name ) end def other_model_params params.require(:other_model).permit( :post ) end end |
Strong Parameters に注意です。SomeModel, OtherModel 用のそれぞれ2つについて、Strong Parameters を設定する必要があります。
上述の例は、@some_object と @other_object がアソシエーションを持たないケースですが、モデルが親子関係(has_many/belongs_to など)になっている場合、accepts_nested_attributes_for というメソッドを使うと便利です。詳細は以下ページ等が分かりやすい。
いまさら聞けない!? accepts_nested_attributes_forの使い方 – (゚∀゚)o彡 sasata299’s blog
Rails4 – 複数の子レコードを作成・更新する. accepts_nested_attributes_for – Qiita
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
- 1件のコメント
フォームオブジェクトを使わないで、1つのフォームで複数のモデルのオブジェクトの情報を更新できないか苦戦しておりました。
こちらのサイトで、解決しました。あまりにうれしかったので、コメントさせていただきました。ありがとうございました。