2

Rails 4で1つのform_forに複数の異なるモデルを持つ方法はありますか?

多分何かのような

# gives error
<%= form_for ([@user, @pet]), url: some_path do |u, p| %>
4

2 に答える 2

3

通常、このようなことは、2 つのモデルの関連付けで行われます。その場合、ここでいくつかの仮定を行います。と の 2 つのモデルがあるuserとしpetます。peta は aに属し、userauserは多くの を持つことができると仮定し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
于 2013-10-05T01:18:09.753 に答える
1

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

独自のヘルパーとフォーム ビルダーを定義するか、カスタム テンプレート ビューを記述して複数のレコードを受け入れることができます。

于 2013-10-05T01:16:08.080 に答える