【问题标题】:What things do I need to know when creating model from another controller and mass-assignment从另一个控制器和批量分配创建模型时我需要知道什么
【发布时间】:2012-07-25 21:33:43
【问题描述】:

我有一个名为 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

所以我不确定我需要添加什么才能通过批量分配,谁能帮我弄清楚/解释一下吗?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 修复了它,我确实将其更改为新方法,现在读取 DefaultCompany.create(company_id: company.id, user_id: self.id)
    【解决方案2】:

    您可以将Company 上的attr_accessible 属性更改为:user:company,或者在set_default_company 方法调用中设置:company_id:user_id

    编辑:

    exists = DefaultCompany.find(self.id)
    

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

    【讨论】:

    • 是的,我实际上改变了那个部分,它不断出现 ActiveRecord::RecordNotFound 错误,所以我添加了一个救援,你在说什么吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2014-02-01
    相关资源
    最近更新 更多