2011-01-31 3 views
1

Я пытаюсь добавить разрешение на создание своих рельсов 3 приложения. Все это хорошо, за исключением того, что Im также пытается следовать this учебным пособиям, чтобы динамически устанавливать attr_accessible для role_ids только для пользователей admin (я не хочу, чтобы обычные пользователи меняли свою роль, но администратор должен быть в состоянии это сделать) ... проблема в том, метод railscast tutorial предполагает, что у меня есть доступ к изменению поведения контроллера, когда на самом деле устройство обрабатывает все это под капотом.Rails Devise attr_accessible problem

Пожалуйста, помогите

ответ

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. Это более подробно, чем ответ Аррела, но это не заставляет вас добавлять роль (или другие поля) в 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, resource

Этот вызов, к сожалению, должен быть сделан после того, как объект (или любой другой) был создан. Это означает, что вам придется подклассифицировать контроллер и вызвать это после создания ресурса при обновлении и создании.

Это для Rails 3.2. В более ранних версиях я считаю, что метод mass_assignment_authorizer не принимает параметр. Аттрибут attr_accessible без значений устанавливает отказ отказоустойчивого приложения для массового присвоения. Это также можно сделать в файле application.rb с

config.active_record.whitelist_attributes = true