2012-03-27 104 views
4

我有2個模型用戶和地址。嵌套表格導軌

class User < ActiveRecord::Base 
    has_many :addresses 
    accepts_nested_attributes_for :addresses 
end 

class Address < ActiveRecord::Base 
    belongs_to :user 
end 

我控制器

def new 
    @user = User.new 
    @user.addresses << Address.new 
    @user.addresses << Address.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     #do something 
    else 
     render 'new' 
    end 
    end 

而且我查看

<%= form_for @user do |f| %> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
     <%= f.fields_for :addresses do |a| %> 
     <p> Home </p> 
     <%= a.text_field :state %> 
     <%= a.text_field :country%> 
     <%= a.text_field :street %> 
     <p> Work </p> 
     <%= a.text_field :state %> 
     <%= a.text_field :country%> 
     <%= a.text_field :street %> 
     <% end %> 
    <% end %> 
    <% end %> 

我的問題是我得到的只是最後的狀態,國家,街道PARAMS輸入。

"addresses_attributes"=>{"0"=>{"street"=>"test", "state"=>"test",, "country"=>"test"}, 
"1"=>{"street"=>"", "state"=>"", "country"=>""}} 

此外,如果有更好的方法來做到這一點,我將不勝感激任何建議。

+0

你是什麼意思只是最後一個?你在這裏顯示的輸出清楚地表明你正在接收兩者。 addresses_attributes [0]和addresses_attributes [1] – Faisal 2012-03-27 10:19:19

+0

是的,但我填寫了所有的字段,只有最後3個發送。 – lesce 2012-03-27 10:22:13

+0

示例:前3個字段用'test0'填充,後3個用'test'填充。 – lesce 2012-03-27 10:23:06

回答

5

rails API表示fields_for將由它自己重複在地址集合中的每個元素上。

我會建議在你的地址上添加一種標籤(如工作,家庭等)。然後它應該自行工作。有了這個標籤,當你想添加更多的地址時,你會更加靈活。

<%= f.fields_for :addresses, @user.addresses do |a| %> 
    <p> <%= a.object.label %> </p> 
    <%= a.text_field :state %> 
    <%= a.text_field :country%> 
    <%= a.text_field :street %> 
    <% end %> 
+0

好吧我嘗試了你說的,我得到一個未定義的方法'is_home_address'爲零:NilClass錯誤,有什麼想法? – lesce 2012-03-27 11:11:27

+0

您能否提供一些更多信息?一些行號和代碼圍繞這個數字?我發現很難總是猜測錯誤:P – klump 2012-03-27 11:12:58

+0

好的我通過將表單封裝在@ user.addresses.each do | address |中來修復錯誤。並將地址對象添加到fields_for:addresses,address ....現在我可以訪問該對象...但參數更改了params [:user] [:address],並且只發送了一個地址。 – lesce 2012-03-27 11:24:30

3

fields_for:addresses已經爲你做循環,所以你不需要重複狀態,國家和街道。然後在表格

def new 
    @user = User.new 
    @user.addresses.build(address_type: 'Home') 
    @user.addresses.build(address_type: 'Work') 
end 

:所以你的情況,你可以添加新的領域地址類型則控制器應該是這樣的

<%= form_for @user do |f| %> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    <%= f.fields_for :addresses do |a| %> 
     <%= a.hidden_field :address_type %> 
     <p><%= a.object.address_type %></p> 
     <%= a.text_field :state %> 
     <%= a.text_field :country%> 
     <%= a.text_field :street %> 
    <% end %> 
    <% end %> 
<% end %> 

a.object參考地址對象。

+0

好吧我試過你說的話,我得到一個未定義的方法'is_home_address'爲零:NilClass錯誤,有什麼想法? – lesce 2012-03-27 10:55:46

+0

您是否將address_type遷移到db?當您訪問表單時是否發生錯誤?我更新了我的答案,將隱藏字段添加到address_type中,以便它堅持db。如果仍有問題,請嘗試使用以下命令進行調試:<%= debug a.object%>。 – 2012-03-27 11:25:50

+0

是的問題是,a.object是零。 – lesce 2012-03-27 11:41:48