我有一个名为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
所以我不确定我需要添加什么才能通过批量作业,任何人都可以帮我弄清楚/解释一下吗?
答案 0 :(得分:1)
您可以将attr_accessible
上的Company
属性更改为:user
和:company
,也可以将:company_id
和:user_id
设置为{{1}方法调用。
编辑:
set_default_company
根据你的逻辑,这似乎是错误的。
答案 1 :(得分:1)
我认为rails对于大规模分配中的命名是严格的,因此虽然您已将company_id
和user_id
列入白名单,但您尚未将company
和user
列入白名单。
尝试将set_default_company
中的作业更改为:
if exists
exists.update_attributes(company_id: company.id)
else
DefaultCompany.create(company_id: company.id, user_id: self.id)
end