я пытаюсь винт с
молоток
Э-э, возможно; -)
Если я правильно читаю, у вас есть ситуация, когда действия в контроллере имеют разные уровни доступа, поэтому вы хотите удалить дублирование, создав одну функцию проверки?
Значит, ты собираешься сделать что-то подобное?
before_filter :check_role('admin'), :only => [:admin, :debug]
before_filter :check_role('power'), :only => [:edit, :delete]
Но параметр в скобках недопустим. И в любом случае, я все еще вижу здесь частое дублирование!
В общем, с областью функциональности, которая так же часто посещается, как и фильтры контроллеров, если вы не можете что-то сделать, это, вероятно, потому, что вы смотрите на что-то неправильно. (Помните, что Rails с гордостью называет себя «программным обеспечением»!)
Как было бы, если бы вы могли знать имя действия в методе фильтра?
Тогда у нас будет
before_filter :check_role
Что довольно СУХОЙ .
Мы могли бы определить разрешения в хэше, возможно:
Perms = { :admin => ['admin'], :edit => ['admin', 'power'], etc
... которые, кажется, заключают в себе различные элементы дублирования. Если это становится сложным, то все это может переместиться в таблицу, хотя тогда вы, вероятно, дублируете функциональность, уже доступную в плагине.
И у нас будет
protected
def check_role
for required_role in Perms[params[:action]]
return if logged_in_user.has_role? required_role
end
flash[:notice] = 'Access to that area requires additional privileges.'
redirect_to :back
end
Или что-то подобное. params [: action] работает в моей текущей версии Rails (2.1.2), хотя в книге Rails (v2) упоминается метод action_name
, который мне кажется пустым.