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

的问题是,我想率模型来存储数据如下:

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

但它仍然没有打造出来的嵌套参数正常。汽车参数未正确识别。

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

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

答案: 我想出了一个办法。我有added my own answer解释它。

回答

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

This bui在提交表单时,适当地散列params散列并创建速率模型条目。

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

0

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

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

+0

我应该添加到原来的问题。该表单与用户共享其他属性,而不仅仅是费率。为了简洁,我缩短了它。它必须在用户控制器下。我会更新原来的问题。 – 2013-02-28 03:17:33

+0

不用了解细节,我的第一印象是混合更新用户属性和添加费率是不合逻辑的。一种形式需要太多关注。不同的行为有不同的形式,增加率是增加率,更新的形式是更新形式。 – 2013-02-28 03:25:39

+0

这是可能的。我已经添加了我自己的答案,就如何解决它。 – 2013-02-28 19:27:20

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

这你的问题的可能解决方案。只需检查它。

+0

并不完全是答案,但它指出了我最终导致的一个新方向。我会投你的实用!谢谢。 – 2013-02-28 19:27:58