2011-01-31 62 views
1

我試圖添加設計授權到我的rails 3應用程序。 它的一切順利,除了我也試圖遵循this教程動態設置attr_accessible for role_ids只爲管理員用戶(我不想讓普通用戶改變他們的角色,但管理員應該能夠這樣做)...問題是, railscast教程方法假定我有權訪問更改控制器的行爲,實際上devise正在處理所有這些問題。Rails設計attr_accessible問題

請幫助

回答

1

你也可以繼承該設計的控制器,你只需要生成視圖,並將其移動到正確的位置。在設計自述文件中查看「配置視圖」和「配置控制器」。

我最終將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/

0

我發現處理此問題的最佳方式是從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