处理attr_accessor
的rails 3.1部分显然已损坏。
我有几个模型根本没有数据库,有些模型没有持久化的属性。
示例:
class User < ActiveRecord::Base
#persisted attribs
attr_accessible :name, :email, :password, :password_confirmation, :is_admin, :permissions
#non persisted attribs<br />
attr_accessor :roseburg, :kfc, :kcpl
........
如果我尝试将用户保存在控制器中,则使用
创建或更新def create<br />
@user = User.new(params[:user])
或
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
我收到类似Cannot mass assign protected attributes :roseburg, :kfc,
:kcpl
解决方法是填充属性并使用save方法。
def create
@user = User.new
(params[:user]).each do |attr_name, attr_value|
if @user.respond_to?("#{attr_name}")
@user.send("#{attr_name}=", attr_value)
end
end
@user.save
.....
和
def update
@user = User.find(params[:id])
respond_to do |format|
(params[:user]).each do |attr_name, attr_value|
if @user.respond_to?("#{attr_name}")
@user.send("#{attr_name}=", attr_value)
end
end
if @user.save
....
我的问题是这对安全性有什么影响?
答案 0 :(得分:1)
当您将哈希传递给new
,create
或update_attributes
等方法时,Rails会确保您只能批量分配{{1}允许的属性或者,或者,不允许使用attr_accessible
列入黑名单的属性。
如果您未将attr_protected
,:roseburg
和:kfc
添加到:kcpl
,则会产生类似您所描述的质量分配错误。< / p>
由attr_accessible
定义它们只能保证您拥有setter和getter(例如attr_accessor
和roseburg=
),这与Rails的质量分配检查无关。 roseburg
实际上是一个Ruby构造,而不是ActiveRecord提供的任何东西。
如果您没有将非持久属性添加到attr_accessor
,则需要在初始化模型实例时手动分配值,就像您在问题中描述的那样。