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