2011-09-26 62 views
0

有問題我想通過表單提交地址添加到用戶模型,但我有麻煩。用戶:Rails 2.3.5與form_for和fields_for

class User < ActiveRecord::Base 
    has_many :addresses 
end 

可以通過由帳戶控制器控制的帳戶頁面向他的帳戶添加地址。

class AccountsController < ApplicationController 
    def addresses 
     @user = current_user 
     @addresses = @user.addresses 
     default_country = Country.find Spree::Config[:default_country_id] 
     @countries = Checkout.countries.sort 
     @states = default_country.states.sort 
    end 
end 

在查看「/帳號/地址」,我有我試圖提交表單:

<% form_for @user do |user_form| %> 
    <% user_form.fields_for :address do |address_form| %> 
      <%= address_form.text_field :firstname, :class => 'required', :value=>"" -%> 
      <%= address_form.text_field :lastname, :class => 'required', :value=>"" -%> 
      <%= address_form.text_field :business_name, :class => 'required', :value=>"" -%> 
      <%= address_form.text_field :address1, :class => 'required', :value=>"" -%> 
      <%= address_form.text_field :address2, :value=>"" %> 
      <%= address_form.text_field :city, :class => 'required', :value=>"" -%> 
      ... 
     <%= address_form.submit %> 
    <% end -%> 
<% end %> 

我在這裏看一個一對多fields_for代碼:

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

,但問題是我有多個地址,但只希望在同一時間提交一個地址。我需要添加到用戶/地址模型和/或帳戶控制器中,以便在我提交該表單時成功創建地址並將其添加到用戶模型中?如果有更簡單的方法來實現這一點,請讓我知道。

回答

0

你需要accepts_nested_attributes_for

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

而且你的形式可能是

<% form_for @user do |user_form| %> 
    <% user_form.fields_for :addresses do |address_form| %> 
      <%= address_form.text_field :firstname, :class => 'required' -%> 
      <%= address_form.text_field :lastname, :class => 'required' -%> 
      <%= address_form.text_field :business_name, :class => 'required' -%> 
      <%= address_form.text_field :address1, :class => 'required' -%> 
      <%= address_form.text_field :address2 %> 
      <%= address_form.text_field :city, :class => 'required' -%> 
      ... 
     <%= address_form.submit %> 
    <% end -%> 
<% end %> 

這將讓你編輯所有現有的地址,如果你需要1添加到列表中,你可以

@user.addresses.build在你的控制器動作中填充一個空的。

+0

我很困惑這將如何工作。可以說用戶已經有2個地址了,並且想要添加一個來創建3個地址段,是不是會有2個地址段?我的控制器動作應該是什麼樣子? – Zyren

+0

'user_form.fields_for:addresses do | address_form |'將遍歷'addresses'關聯中的每個'Address'。你可以把他@ @ user.addresses.build'調用放在你需要空地址的任何地方。如果你使用的是'accep_nested_attributes_for',你的參數是'{'user'=> {'addresses_attributes'=> {'0'=> {:firstname =>'名字'...},'1'= > {:firstname =>'Second name'...}}}'你總是通過'@ user.update_attributes(params [:user])'來更新它。這是你正在尋找什麼,或者你只是想保存個人地址? –

+0

當我調用'@ users.addresses.build'時,是否會清除當前存儲在用戶中的所有地址以創建空白地址?我想保留已經與用戶關聯的所有地址,並使用此表單提交將其他地址添加到用戶。如果我正在使用的視圖正在使用帳戶控制器,則表單將提交的操作將位於帳戶或用戶控制器中?我似乎很困惑我在哪裏調用'@ user.update_attributes(params [:user])' 我對rails非常陌生,所以任何額外的說明都會非常有幫助。謝謝。 – Zyren