Как я могу заставить функцию before_filter вести себя по-разному в зависимости от действия? - PullRequest
3 голосов
/ 17 января 2011

Я пытаюсь сделать мой код аутентификации / разрешений более лаконичным.

В настоящее время у меня есть это:

  def index
      require_role "normal" do
          @projects = Project.all
          respond_to do |format|
              format.html 
          end
      end
  end

где require_role обрабатывает проверку разрешений и перенаправление на страницу с ошибкой, если вы пытаетесь сделать что-то, чего не следует делать.

Я бы хотел иметь возможность разместить что-то вроде этого в верхней части каждого контроллера:

require_role "admin", [:delete]
require_role "normal", [:edit, :new, :create]
require_role "guest", [:show, :index]

определил что-то вроде:

 def self.require_perm( role_name, actions )
    before_filter :require_perm_admin, :only => actions
 end

Единственная проблема заключается в том, что мне нужно жестко закодировать название метода, require_perm_admin. Это означает, что если я когда-нибудь добавлю новые роли, мне придется определить метод для каждой из них.

Можно ли добавить динамически именованные методы в класс? например "check_role_admin", "check_role_guest" и т. д.

В противном случае, могу ли я сказать, какое действие должно быть вызвано из моей before_filter функции?

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Если вам нужно только имя текущего действия, вы можете позвонить action_name в before_filter.Я оставлю все остальное на ваше усмотрение, если это все, что вам нужно:)

1 голос
/ 17 января 2011

Почему бы не сделать что-то вроде

def self.require_perm( role_name, actions )
    before_filter "require_perm_#{role_name}".to_sym, :only => actions
end
...