Rails 4で1つのform_forに複数の異なるモデルを持つ方法はありますか?
多分何かのような
# gives error
<%= form_for ([@user, @pet]), url: some_path do |u, p| %>
Rails 4で1つのform_forに複数の異なるモデルを持つ方法はありますか?
多分何かのような
# gives error
<%= form_for ([@user, @pet]), url: some_path do |u, p| %>
通常、このようなことは、2 つのモデルの関連付けで行われます。その場合、ここでいくつかの仮定を行います。と の 2 つのモデルがあるuser
としpet
ます。pet
a は aに属し、user
auser
は多くの を持つことができると仮定しpets
ます。この種の関連付けでは、pet
モデルはuser_id
ユーザーをそのペットに関連付ける属性を持ちます。
ユーザーモデル
attr_accessible :name, :pets_attributes
has_many :pets
accepts_nested_attributes_for :pets
ペットモデル
attr_accesible :user_id, :name
belongs_to :user
simple_form
個人的には、クールな関連付け機能を備えているため、大ファンです。
意見
<% simple_form_for @user do |f| %>
<%= f.input :name %>
<%= f.simple_fields_for :pets do |p| %>
<% p.input :name %>
<% end %>
<% end %>
コントローラ
コントローラー内 (これがnew
アクションであると仮定します)。これにより、ユーザー用の列が作成され、ペット用の 3 つのスポットが作成されます。
def new
@user = User.new
3.times do
@user.pets.build
end
end
ルート
ルートに関して考慮すべきことの 1 つは、これと同様にルートを設定することです。これにより、ペットショーアクションもユーザーに参照されるため、ルートが少しきれいになります。/users/:user_id/pets/:pet_id
resources :users do
resources :pets
end
form_for
ヘルパーでは、レコードが 1 つしかないため使用できません。構文 with[@user, @pet]
は、関連付けられたレコードの正しいルートを構築するためのものです。渡された配列の最後の要素のみがレコードとして使用されます。その他は正しいルートを作成するために使用されます。したがって、あなたの例では、ユーザーが1つまたは複数のペットを飼って@user
いて永続化されていると仮定すると、結果ルートは次のいずれかのようになります:
"user/#{@user[:id]}/pet/#{@pet[:id]}" # when @pet is persisted
"user/#{@user[:id]}/pet/new" # if @pet = Pet.new
独自のヘルパーとフォーム ビルダーを定義するか、カスタム テンプレート ビューを記述して複数のレコードを受け入れることができます。