2012-09-17 97 views
0

我检查了类似问题的一些答案,似乎都表明问题是attr_accessible,但我似乎无法得到这个工作。不能批量分配嵌套属性

基本上我有用户&地址模型,并希望将地址属性分配为嵌套属性。但是,当我保存它会导致无法批量分配属性错误如下所示。

我已经在下面的代码中尝试了attr_accessible的许多变体,例如:addresses_attributes,:address_attributes,:primary_address_attributes ...我不确定它为什么不工作,也许是因为它在成员模块声明中?

任何人都可以帮忙吗?

class Member::User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    # each user may have zero or many addresses 
    # their primary email is also set as their login id. 
    has_many :addresses 

    has_one :address, :class_name => "Member::Address", :conditions => "is_primary = true" 
    accepts_nested_attributes_for :addresses, :address 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me,  :address_attributes 

    validates_presence_of :email 

end 

我的形式提交嵌套字段(相关部分)

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => "form-horizontal"}) do |f| %> 
    <small>Mandatory fields marked *</small><br><br> 
    <% devise_error_messages! %> 
    <% flash.each do |name, msg| %> 
     <div class="alert alert-<%= name == :notice ? "success" : "error" %>"> 
     <a class="close" data-dismiss="alert">×</a> 
     <%= msg %> 
     </div> 
    <% end %> 

    <%= f.fields_for resource.build_primary_address do |address_form| %> 
    <div class="control-group"> 
     <%= address_form.label :first_name, :class => "control-label" %> 
     <div class="controls"> 
      <%= address_form.text_field :first_name, :class => "input-xlarge" %> 
     </div> 
     </div> 

    <div class="control-group"> 
     <%= address_form.label :last_name, :class => "control-label" %> 
     <div class="controls"> 
      <%= address_form.text_field :last_name, :class => "input-xlarge" %> 
     </div> 
     </div> 
    <% end %> 

错误表明这一点:

Can't mass-assign protected attributes: member_address 

{"utf8"=>"✓", 
"authenticity_token"=>"HrZJG2krn15veUKJVh6PgEs4wwufaeRhciHcUIn6AaM=", 
"user"=>{"member_address"=>{"first_name"=>"asdf", 
"last_name"=>"asdfsafd"}, 
"email"=>"[email protected]", 
"password"=>"[FILTERED]", 
"password_confirmation"=>"[FILTERED]"}} 

回答

1

为了轨理解的是,主地址的形式提交是一个嵌套的属性,你要在这里明确告诉它的关系:

<%= f.fields_for :address, resource.build_primary_address do |address_form| %> 

。原因是,因为您的模型名称的作用域为Member::,并且Rails从类名称中派生表单参数名称,所以在您的params散列中,最终会使用:member_address而不是:address。因为:在这种情况下地址是一个字段,其中:用户接受嵌套的属性,:地址在params散列中应该表示为:address_attributes,所以确保后者出现在attr_accessible中。

+0

辉煌!我被困在那一个,也许6个小时,我一直试图找出它,修复它,非常感谢。 –

+0

很高兴有帮助! – cdesrosiers

0

添加

attr_accessible :member_address 

到用户模式。

说明:您希望初始化ActiveRecord实例的每个哈希键都必须声明为attr_accessible。看着你的哈希键有:在初始化用户实例的哈希

"user"=>{"member_address"=>{ ... }} 

member_address关键,因此它必须包含在attr_accessible声明。

+0

回来了未知的属性:member_address –

+0

我试过这个建议,它没有奏效,错误与我在上面评论中写的错误。 –

相关问题