2012-09-06 55 views
1

處理attr_accessor的導軌3.1部分顯然已損壞。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

解決方法是填充屬性並使用保存方法。

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

當你傳遞一個哈希像newcreate,或update_attributes的方法,Rails會確保你只能大規模分配了與attr_accessible允許的屬性(或者,將不允許屬性與attr_protected黑名單) 。

如果不加:roseburg:kfc,並:kcplattr_accessible,它會拋出一個大規模分配錯誤像你描述的一個。

通過attr_accessor定義它們只能確保您擁有setter和getters(例如,roseburg=roseburg),這與Rails的質量分配檢查無關。 attr_accessor實際上是一個Ruby構造,而不是由ActiveRecord提供的任何東西。

如果您未將非持久屬性添加到attr_accessible,則需要在初始化模型實例時手動分配值,就像您在問題中描述的一樣。

+0

如果我將它們添加到attr_accessible,Rails的嘗試將其保存到數據庫,並給了我的ActiveRecord :: UnknownAttributeError在UsersController#更新 – user1585163

+1

如果我將它們添加到attr_accessible,Rails的嘗試將其保存到數據庫,並給了我 的ActiveRecord :: UsersController中的UnknownAttributeError#update 但是(在這裏發現)當我將它們添加到這兩個列表時......它可以很好地使用默認的新建(params [user])和更新。 去圖。 attr_accessible:姓名,:電子郵件:密碼:password_confirmation,:is_admin,:權限:羅斯堡,:肯德基,:kcpl attr_accessor:羅斯堡,:肯德基,:kcpl 這是沒有預料到,至少我或任何其他線程我已經搜索 – user1585163

+0

很高興你整理出來!有趣... –

相關問題