1

我有三个模型:

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

和一个控制器:

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 %>

问题是我希望 Rate 模型按如下方式存储数据:

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

我无法弄清楚如何正确构建fields_for助手来为user_id和构建正确的参数car_id

就像是:

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

我已经尝试过更明确的fields_for这样的:

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

但它仍然没有正确构建嵌套参数。未正确识别汽车参数。

任何帮助,将不胜感激!谢谢。

编辑:控制器动作必须在用户之下。为简洁起见,上面的示例已被缩短,但其他与用户相关的属性可通过表单获得,因此它必须使用 users 控制器。

回答:我想出了一个办法。我添加了自己的答案来解释它。

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

我想我已经弄清楚了。

在我的控制器中,我修改了构建方法如下:

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 %>

这会正确构建参数哈希并在提交表单时创建速率模型条目。

在控制器中检查现有用户费率将确保在表单中使用现有值并且不构建新值(我认为构建考虑了......?)。

于 2013-02-28T19:26:56.240 回答
0

该表单将创建一个新速率而不是一个新用户,因此该方法应该在 RatesController 而不是 UsersController 中。

有了这个逻辑,问题似乎就解决了。你可以写field_for rate[user]field_for rate[car]

于 2013-02-28T03:01:16.367 回答