4

我有点难住这一个,因为我觉得我躲过了常见的错误(如mistyping the attr_accessibleleaving it out altogether),但我仍然得到嵌套形式 - 不能质量分配受保护的属性

Can't mass-assign protected attributes: home, work 

错误在这里。我猜我错过了一些东西,但我不确定是什么。

无论如何,在我的新的应用程序,用户有一个家庭和一个工作(其中每个属于用户),我想用户输入他们签约。所以,在我的模型:

user.rb

attr_accessible :email, :first_name, :last_name, :password, :password_confirmation, :home_attributes, :work_attributes 

    has_one :home, :work 

    accepts_nested_attributes_for :work, :home 

    has_secure_password 

home.rb

attr_accessible :address, :latitude, :longitude, :user_id 
belongs_to :user 

validates :address, presence: true 

work.rb

attr_accessible :address, :latitude, :longitude, :user_id 
belongs_to :user 

validates :address, presence: true 

在我的控制器

users_controller.rb

def new 
    @user = User.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { redirect_to @user } 
    end 
end 

,并在我的形式:

的意见/用户/ _form.html.haml

= form_for @user do |f| 
    - if @user.errors.any? 
    .error_explanation 
     %h2 
     = pluralize(@user.errors.count, "error") 
     prohibited this post from being saved: 
     %ul 
     - @user.errors.full_messages.each do |msg| 
      %li= msg 

    = f.label :first_name 
    = f.text_field :first_name 

    = f.label :last_name 
    = f.text_field :last_name 

    = f.label :email 
    = f.text_field :email 

    = f.label :password 
    = f.password_field :password 

    = f.label :password_confirmation, "Re-Enter Password" 
    = f.password_field :password_confirmation 

    = f.fields_for :home do |builder| 
    = builder.label :address, "Home address" 
    = builder.text_field :address 
    %br 
    = f.fields_for :work do |builder| 
    = builder.label :address, "Work address" 
    = builder.text_field :address 

    .btn-group 
    = f.submit 'Sign Up!', class: "btn" 
+0

这是奇怪的,我认为错误是说,它不能分配'home'当真正的参数应该被命名为'home_attributes'。你有没有尝试在你的新动作中执行'@ user.build_home'和'@ user.build_work'设置? – awbergs 2013-03-23 01:31:47

+0

我尝试添加这两条线 - “@Home = Home.new” 和 “@Work = Work.new” - 在我的控制器,然后做 “f.fields_for @Home做|制造商|”。你是这个意思吗?这种抗议类似。 – Sasha 2013-03-23 01:46:21

+1

否定的。你要专门建立它为您@user对象('@ user.build_home','@ user.build_work') – awbergs 2013-03-23 01:48:10

回答

3

它看起来你有没有设置您的实例变量以包含这些属性。

在你的控制器,你应该有这样的事情

def new 
    @user = User.new 
    @user.homes.build 
    @user.works.build 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { redirect_to @user } 
    end 
end 

如果不建这些属性的形式,不知道该怎么办。

编辑:建立嵌套的资源固定的语法

+0

当我尝试,我得到“未定义的方法'建设”为#<用户:0x007fb028666bd0>” – Sasha 2013-03-23 01:48:10

+0

试用最新版本 – muttonlamb 2013-03-23 01:53:25

+0

哈。现在:“未定义的方法'构建为零:NilClass”:) – Sasha 2013-03-23 01:54:24

相关问题