1

私は3つのモデルを持っています:

class Rate < ActiveRecord::Base
  attr_accessible :user_id, :car_id, :rate

  belongs_to :user
  belongs_to :car
end

class User < ActiveRecord::Base
  attr_accessible :name

  has_many :rates
  accepts_nested_attributes_for :rates
end

class Car < ActiveRecord::Base
  attr_accessible :name

  has_many :rates
  accepts_nested_attributes_for :rates
end

そして1つのコントローラー:

class UsersController < ResourceController
  def new
    # Assume user is loaded
    @user.rates.build
  end
end

ユーザー/車のリストとそれに関連付けられた料金を関連付けるネストされたフォームを作成しようとしています。

何かのようなもの:

<% form_for @user do |f| %>
  <%= @user.name %><br />
  <% Car.all.each do |car| %>
    <%= car.name %><br />
    <%= f.fields_for :rates do |r| %>
      <%= r.number_field :rate %>
    <% end %>
  <% end %>
<% end %>

問題は、レートモデルに次のようにデータを保存させたいことです。

USER_ID    CAR_ID    RATE
1          1         10
1          2         20
1          3         30
2          1         40
3          2         50

とのfields_for両方に適切なパラメータを作成するためにヘルパーを適切に作成する方法がわかりません。user_idcar_id

何かのようなもの:

user[car=1][rate]
user[car=2][rate]

私は次のfields_forようにもっと明確にしようとしました:

<%= r.fields_for 'user[car][rate]' %>

ただし、ネストされたパラメータは適切に作成されません。車のパラメータが正しく識別されていません。

どんな助けでもいただければ幸いです!ありがとう。

編集:コントローラーのアクションはユーザーの下にある必要があります。上記の例は簡潔にするために短縮されていますが、他のユーザー関連の属性はフォームから利用できるため、ユーザーコントローラーを使用する必要があります。

答え:私はそれを行う方法を考え出しました。私はそれを説明する私自身の答えを追加しました。

4

3 に答える 3

1
<% form_for @user do |f| %>
  <%= @user.name %><br />
   <%= f.fields_for :rates do |r| %>
      <% Car.all.each do |car| %>
      <%= car.name %><br />
      <%= r.number_field :rate %>
    <% end %>
  <% end %>
<% end %>

これはあなたの問題の解決策かもしれません。確認してください。

于 2013-02-28T04:02:41.237 に答える
0

フォームは新しいユーザーではなく新しいレートを作成するため、メソッドはUsersControllerではなくRatesControllerにある必要があります。

このロジックで問題は解決したようです。あなたは書くことができfield_for rate[user]ますfield_for rate[car]

于 2013-02-28T03:01:16.367 に答える
0

私はそれを理解したと思います。

私のコントローラーでは、ビルドメソッドを次のように変更しました。

Car.all.each { |c| @user.rates.build(car_id: c.id) } if @user.rates.count == 0

次に、私のモデルでは、次のものが必要です。

attr_accessible :rates_attributes

最後に、fields_forブロックは次のようになります(これは、@ userフォームオブジェクトfにあることを忘れないでください)。

<%= f.fields_for :rates do |r| %>
  <%= r.hidden_field :car_id %>
  <%= r.object.car.name %><br />
  <%= r.number_field :rate %>
<% end %>

これにより、paramsハッシュが適切に構築され、フォームの送信時にレートモデルエントリが作成されます。

コントローラの既存のユーザー率をチェックすることで、既存の値がフォームで使用され、新しい値がビルドされないことが確認されます(ビルドが考慮されたと思います...?)。

于 2013-02-28T19:26:56.240 に答える