Rails 3.1无法为非数据库模型大量分配受保护的属性

时间:2012-09-06 21:53:25

标签: ruby-on-rails-3 ruby-on-rails-3.1

处理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
  ....

我的问题是这对安全性有什么影响?

1 个答案:

答案 0 :(得分:1)

当您将哈希传递给newcreateupdate_attributes等方法时,Rails会确保您只能批量分配{{1}允许的属性或者,或者,不允许使用attr_accessible列入黑名单的属性。

如果您未将attr_protected:roseburg:kfc添加到:kcpl,则会产生类似您所描述的质量分配错误。< / p>

attr_accessible定义它们只能保证您拥有setter和getter(例如attr_accessorroseburg=),这与Rails的质量分配检查无关。 roseburg实际上是一个Ruby构造,而不是ActiveRecord提供的任何东西。

如果您没有将非持久属性添加到attr_accessor,则需要在初始化模型实例时手动分配值,就像您在问题中描述的那样。