我試圖添加設計授權到我的rails 3應用程序。 它的一切順利,除了我也試圖遵循this教程動態設置attr_accessible for role_ids只爲管理員用戶(我不想讓普通用戶改變他們的角色,但管理員應該能夠這樣做)...問題是, railscast教程方法假定我有權訪問更改控制器的行爲,實際上devise正在處理所有這些問題。Rails設計attr_accessible問題
請幫助
我試圖添加設計授權到我的rails 3應用程序。 它的一切順利,除了我也試圖遵循this教程動態設置attr_accessible for role_ids只爲管理員用戶(我不想讓普通用戶改變他們的角色,但管理員應該能夠這樣做)...問題是, railscast教程方法假定我有權訪問更改控制器的行爲,實際上devise正在處理所有這些問題。Rails設計attr_accessible問題
請幫助
你也可以繼承該設計的控制器,你只需要生成視圖,並將其移動到正確的位置。在設計自述文件中查看「配置視圖」和「配置控制器」。
我最終將role_ids添加到attr_accessible,然後子類化RegistrationsController並添加一個before_filter以刪除非管理員的參數。
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :remove_admin_params, :only => [:create, :update]
protected
# disable setting the role_ids value unless an admin is doing the edit.
def remove_admin_params
params[:user].delete(:role_ids) unless current_user.try(:admin?)
end
end
只要確保將註冊視圖添加到/app/views/users/registrations/
。
我發現處理此問題的最佳方式是從RailsCast 237。它比Arrel的答案更詳細,但它不會強制您將角色(或其他字段)添加到attr_accessible。
添加在初始化下面的方法:然後
class ActiveRecord::Base
attr_accessible
attr_accessor :accessible
private
def mass_assignment_authorizer(role = :default)
if accessible == :all
self.class.protected_attributes # hack
else
# super returns a whitelist object
super + (accessible || [])
end
end
end
在你的控制器,你可以這樣做:
user.accessible =:角色如果能? :set_role,資源
不幸的是,這個調用必須在用戶(或其他)對象被實例化之後進行。這意味着您必須繼承控制器的子類,並在更新和創建資源實例化後調用它。
這是針對Rails 3.2的。在早期版本中,我認爲mass_assignment_authorizer方法不帶參數。不帶值的attr_accessible會爲質量分配設置自動防故障應用程序廣泛拒絕。這也可以在application.rb文件中完成
config.active_record.whitelist_attributes = true