2012-01-30 48 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