1

处理的rails 3.1部分attr_accessor显然已损坏。

我有几个模型根本没有数据库,有些模型的属性没有持久化。

例子:

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

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

4

1 回答 1

1

当您将哈希传递给类似new,create或的方法时update_attributes,Rails 将确保您只能批量分配允许使用的属性attr_accessible(或者,不允许使用 列入黑名单的属性attr_protected)。

如果您不添加:roseburg,:kfc:kcplto attr_accessible,它将引发像您描述的那样的批量分配错误。

将它们定义为attr_accessor仅保证您将拥有 setter 和 getter(例如roseburg=roseburg),这与 Rails 的批量赋值检查无关。attr_accessor实际上是一个 Ruby 结构,而不是 ActiveRecord 提供的任何东西。

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

于 2012-09-06T22:06:36.877 回答