2012-01-30 49 views
1

在我的Rails 3.0應用程序中,我有一個客戶端模型和一個多態地址模型。根據下面的代碼,客戶端可以有很多地址。我希望我的表單一次更新單個客戶端地址。我只能看到[addresses_attributes]出現,如果我允許同時編輯所有客戶端的地址。有沒有解決的辦法?Rails 3 - 如何編輯單個嵌套多態資源?

class Client < ActiveRecord::Base 
has_many :addresses, :as => :addressable, :dependent => :destroy 
accepts_nested_attributes_for :addresses 

class Address < ActiveRecord::Base 
    belongs_to :addressable, :polymorphic => true 

客戶端控制器

def edit 
    @client = Client.find(params[:id]) 
    @addresses = @client.addresses 
    if params[:address] 
     @address = @client.addresses.find(params[:address]) 
    else 
     @addresses ? @address = @addresses.first : @address = [] 
    end 
    end 

    def update 
    @client = Client.find(params[:id]) 
    @client.update_attributes(params[:client]) 
    redirect_to client_path(@client) 
    end 

查看

<%= form_for @client do |f| %> 
    <%= render :partial => 'form', :locals => {:f => f} %> 

    <%= f.fields_for @address do |addresses_attributes| %> 
    <%= render :partial => 'addresses/fields', :locals => {:f => addresses_attributes} %>    
    <% end %> 

    <%= f.submit %> 
<% end %> 

回答

0

編輯:

對不起,我重讀後,意識到有更好的選擇。您應該將範圍添加到地址模型中,或者您應該使用條件在客戶端中創建單獨的關聯。

http://railscasts.com/episodes/108-named-scope 或看情況在這裏: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

詳細信息:

class Address < ActiveRecord::Base 
    belongs_to :addressable, :polymorphic => true 
    named_scope :type_one, :conditions => { :address_type => 'one' } 
    named_scope :type_two, :conditions => { :address_type => 'two' } 

<%= f.fields_for @address.type_one do |addresses_attributes| %> 
    <%= render :partial => 'addresses/fields', :locals => {:f => addresses_attributes} %>    
<% end %> 
+0

感謝,威廉你能解釋一下,但更明確該怎麼做和什麼樣的變化,我會需要對我的模型,控制器和視圖? – julesie 2012-01-30 08:44:15

+0

我假設你想分割多態類型。我在上面的答案中提供了細節。 – Wilhelm 2012-01-30 12:07:30

+0

我可能會困惑你,但我不相信我想要通過多態類型進行分割。我有一個有三個不同地址的客戶端。每個的「addressable_type」字段都是「客戶端」。我的問題是,如果我希望他們能夠自己編輯他們的第一個地址,我不能得到* _attributes位出現。 – julesie 2012-01-30 15:28:45