2

我的用戶模型中有一個字段受保護,因爲它確定了許可級別。所以它應該被保護,而不是可以批量分配的。所以即使屬性在3.2中被默認保護,這實際上是我想要的行爲。在Rails中分配受保護的屬性

但是,在一個控制器方法中,我希望允許經理分配此字段,例如用戶創建或用戶更新。

如何允許爲特定控制器操作分配該屬性?

例如,我有我的控制器:

# app/controllers/admin/users_controller.rb 

def create 
    @user = User.new(params[:user]) 
# ... 
end 

現在我會做的是從params[:user]排除clearance,但它似乎得到過濾掉,提高和異常達到該行甚至之前(我嘗試在該行之前放置一個debugger,甚至將其註釋掉,但仍然引發異常)。

受保護的屬性會在哪裏被捕獲,如果不是在撥打User#new

+0

受保護的屬性在調用'User#new'之前應該被捕獲,除非像我的情況那樣,gem Cancan加載資源。 –

回答

4

The Rails way做到這將是分配的屬性,而不保護或使用管理員角色:

@user = User.new 
@user.assign_attributes(params[:user], :without_protection => true) 
@user.save 

然而,我發現這是一個有點乏味,所以我寫了一個名爲sudo_attributes寶石,讓(在我看來)一個更好的API:

@user = User.sudo_new(params[:user]) 
@user.save 

它模仿所有的Rails的實例,創建和更新方法(新,建設,創建,創建!update_attributes方法等)。

0

在過去,我贊成給這種操作其自身包含的方法,只設置此值:

# app/controllers/admin/users_controller.rb 

def full_clearance 
    User.find(params[:id]).update_attribute(:clearance, 'full') 
end 

def restricted_clearance 
    User.find(params[:id]).update_attribute(:clearance, 'restricted') 
end 

現在看看the Rails way Beerlington提到的,我寧願使用的角色,以得到特別行動進入間隙屬性:

# /app/models/user.rb 

attr_accessible :attributes_accessible_by_default, ..., :clearance, :as => :manager 

# app/controllers/admin/users_controller.rb 

def create 
    @user = User.new(params[:user].merge(:as => :manager) 
# ... 
end 

在這種情況下,它甚至有可能,基於用戶角色的屬性給訪問

但這可能會導致再次出現錯誤。

相關問題