从另一个控制器和批量分配创建模型时,我需要知道什么

时间:2012-07-25 21:33:44

标签: ruby-on-rails-3 mass-assignment attr-accessible

我有一个名为DefaultCompany的模型,它没有控制器,而是通过companies_controller创建它,如果他们检查表单上的“默认公司”复选框,则调用user.set_default_company(如下所述)。

默认公司是user_id和company_id的连接表。

class DefaultCompany < ActiveRecord::Base
  attr_accessible :company_id, :user_id
  belongs_to :company
  belongs_to :user
end

我一直收到以下错误:

Can't mass-assign protected attributes: company, user 
app/models/user.rb:22:in `set_default_company'
app/controllers/companies_controller.rb:23:in `create'

我已将我的用户模型设置为能够接受DefaultCompany的嵌套属性,如此

class User < ActiveRecord::Base
  has_one :default_company
  accepts_nested_attributes_for :default_company
  attr_accessible :default_company_attributes

  def set_default_company(company)
    exists = DefaultCompany.find(self.id)
    if exists
      exists.update_attributes(company: company)
    else 
      DefaultCompany.create(company: company, user: self)
    end
  end
end

这是companies_controller.rb的创建动作

def create
@company = Company.new(params[:company])

if @company.save
  if params[:default_company]
    current_user.set_default_company @company.id
  end
  flash[:notice] = "Company was successfully created."
  Role.assign_creator(@company.id, current_user.id)
  redirect_to @company
else
  redirect_to new_company_path
  end
end

所以我不确定我需要添加什么才能通过批量作业,任何人都可以帮我弄清楚/解释一下吗?

2 个答案:

答案 0 :(得分:1)

您可以将attr_accessible上的Company属性更改为:user:company,也可以将:company_id:user_id设置为{{1}方法调用。

编辑:

set_default_company

根据你的逻辑,这似乎是错误的。

答案 1 :(得分:1)

我认为rails对于大规模分配中的命名是严格的,因此虽然您已将company_iduser_id列入白名单,但您尚未将companyuser列入白名单。

尝试将set_default_company中的作业更改为:

if exists
  exists.update_attributes(company_id: company.id)
else 
  DefaultCompany.create(company_id: company.id, user_id: self.id)
end