Ruby on rails 3 Rails 3.1 can';t为非数据库模型分配受保护的属性

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 />

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_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
  ....