Ruby on rails 3 Rails 3.1 can';t为非数据库模型分配受保护的属性
rails 3.1中处理Ruby on rails 3 Rails 3.1 can';t为非数据库模型分配受保护的属性,ruby-on-rails-3,ruby-on-rails-3.1,Ruby On Rails 3,Ruby On Rails 3.1,rails 3.1中处理attr\u访问器的部分显然已损坏 我有几个模型根本没有数据库,还有一些模型的属性没有持久化 例如: class User < ActiveRecord::Base #persisted attribs attr_accessible :name, :email, :password, :password_confirmation, :is_admin, :permissions #non persisted attribs<br />
attr\u访问器的部分显然已损坏
我有几个模型根本没有数据库,还有一些模型的属性没有持久化
例如:
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
........
我遇到一个错误,比如无法批量分配受保护的属性: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
.....
及
我的问题是这对安全性有什么影响?当您将散列传递给像new
、create
或update\u attributes
这样的方法时,Rails将确保您只能批量分配attr\u accessible
(或者,不允许属性被列入黑名单,并受attr\u保护
)
如果不将:roseburg
、:kfc
和:kcpl
添加到属性可访问
,它将抛出与您描述的一样的质量分配错误
由attr\u访问器定义它们只能保证您将拥有setter和getter(例如roseburg=
和roseburg
),这与Rails的大规模分配检查无关。attr\u访问器
实际上是一个Ruby构造,而不是ActiveRecord提供的任何东西
如果不将非持久化属性添加到attr\u accessible
,则在初始化模型实例时需要手动分配值,如您在问题中所述。当您将哈希传递给new
、create
或update\u attributes
等方法时,Rails将确保您可以只有可访问的attr\u时才允许批量分配属性(或者,不允许属性被列入受attr\u保护的黑名单)
如果不将:roseburg
、:kfc
和:kcpl
添加到属性可访问
,它将抛出与您描述的一样的质量分配错误
由attr\u访问器定义它们只能保证您将拥有setter和getter(例如roseburg=
和roseburg
),这与Rails的大规模分配检查无关。attr\u访问器
实际上是一个Ruby构造,而不是ActiveRecord提供的任何东西
如果您没有将非持久化属性添加到attr\u accessible
,您需要在初始化模型实例时手动分配这些值,就像您在问题中描述的那样。如果我将它们添加到attr\u accessible,Rails会尝试将它们保存到数据库中,并在UsersController\upda中提供ActiveRecord::UnknownAttributeError如果我将它们添加到attr#u accessible,Rails会尝试将它们保存到数据库中,并在UsersController中为我提供ActiveRecord::UnknownAttributeError更新,但在我将它们添加到两个列表中时(此处为discovery)…它可以与默认的new(参数[user])一起正常工作和update.Go figure.attr_accessible:name、:email、:password、:password_confirmation、:is_admin、:permissions、:roseburg、:kcpl attr_accessor:roseburg、:kfc、:kcpl这是我或我搜索过的任何其他线程所不希望的,如果我将它们添加到attr_accessible中,Rails会尝试将它们保存到数据库中,并给出相应的操作iveRecord::UsersController中的UnknownAttributeError#update如果我将它们添加到attr#u accessible,Rails会尝试将它们保存到数据库中,并在UsersController中为我提供ActiveRecord::UnknownAttributeError#update,但是(此处的发现)当我将它们添加到两个列表中时……默认的new(参数[user])可以正常工作和update.Go figure.attr_accessible:name、:email、:password、:password_confirmation、:is_admin、:permissions、:roseburg、:kfc、:kcpl attr_accessor:roseburg、:kfc、:kcpl这是我或我搜索过的任何其他线程所不期望的
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
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
....