写了一个 rails 的 demo 项目。用了一个 devise 的 User 的 model,和一个 project model。在 project 中有一个 owner_id 列,通过外键的定义和 User 关联了。
在创建 project 时,遇到了 mass-asign 的问题了,owner_id 不能被赋值。
class Project < ActiveRecord::Base
belongs_to :owner, :class_name => 'User', :foreign_key => :owner_id
attr_accessible :deadline, :description, :name, :owner, :status
validates_presence_of :name, :owner, :deadline
self.per_page = 5
end
第一个问题是,这里可以把 owner_id 加到 attr_accessible 中吗?这样设计是否有问题?
第二个问题是,我在 controller 中做了一下处理
private
def project_params
owner_id = params[:project].delete(:owner_id)
owner = User.find(owner_id) unless owner_id.blank?
params[:project][:owner] = owner
params[:project]
end
但当我引用 cancan 那个 gem 后,出现了这个异常:
load_and_authorize_resource
Can't mass-assign protected attributes: owner_id
process_removed_attributes(gem) activemodel-3.2.12/lib/active_model/mass_assignment_security/sanitizer.rb
class StrictSanitizer < Sanitizer
def process_removed_attributes(attrs)
return if (attrs - insensitive_attributes).empty?
raise ActiveModel::MassAssignmentSecurity::Error, "Can't mass-assign protected attributes: #{attrs.join(', ')}"
end
def insensitive_attributes
['id']
end