=ARRAYFORMULA(QUERY({IFERROR(QUERY(IF(LEN(C2:C),
IF((C2:CTODAY()), "On Going now", )), ),
"where Col1='Past' or Col1='On Going now'"),"");
QUERY(IF(LEN(C2:C),
IF((C2:C>TODAY())*(D2:D>TODAY()), "Next Available", ), ),
"where Col1='Next Available' limit 1")},
"where Col1 is not null"))
Необходимо смочь сделать это с блоком:
before_filter {|controller| controller.check_role('admin') }
Можно использовать немного метапрограммирования. Что-то вроде этого (полностью непротестированный, просто что-то для давания Вам общее представление о том, как это могло бы пойти):
Module RoleWithIt
Role.all.each do |role|
define_method("check_#{role.name}_role".to_sym) do
check_role(role.name)
end
end
def check_role(role_name)
return if logged_in_user.has_role?(role_name)
flash[:notice] = 'Access to that area requires additional privileges.'
redirect_to :back
end
end
ApplicationController.send :include, RoleWithIt
Чтобы иметь его загружаются, когда Ваше приложение инициализирует, просто поместило его в файл, названный role_with_it.rb, и поместило его в Ваш каталог lib.
я пытаюсь управлять винтом с молотком?
Er, возможно ;-)
Если я читаю это правильно, у Вас есть ситуация, где действия в контроллере имеют различные уровни доступа, таким образом, Вы хотите удалить дублирование путем создания единственной функции проверки?
Таким образом, Вы надеетесь делать что-то вроде этого?
before_filter :check_role('admin'), :only => [:admin, :debug]
before_filter :check_role('power'), :only => [:edit, :delete]
Но параметр в parens вещи не законен. И так или иначе, я все еще вижу немного дублирования здесь!
В целом с областью функциональности, также посещаемой, поскольку, контроллер фильтрует, если Вы не можете сделать чего-то, это, вероятно, потому что Вы смотрите на что-то неправильный путь. (Помните, что направляющие горды описать себя как "самоуверенное программное обеспечение"!)
Как это было бы, если бы Вы смогли знать имя действия в своем методе фильтра?
Затем мы имели бы
before_filter :check_role
Который является симпатичным DRY.
Мы могли определить полномочия в Хеше, возможно:
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
Или что-то подобное. параметрические усилители [: действие] работает над моей текущей версией (2.1.2) направляющих, хотя книга (v2) направляющих упоминает action_name
метод, который, кажется, возвращает пробел для меня.
Я не полагаю, что можно передать параметры фильтрам. Таким образом, то, что я имею, делают в прошлом, сделано статическими методами, которые передают параметр методу, для которого нужны параметрические усилители.
Таким образом, у меня было бы что-то вроде этого:
def check_role(role_name)
unless logged_in_user.has_role? role_name
flash[:notice] = 'Access to that area requires additional privileges.'
redirect_to :back
end
end
def check_admin_role
check_role('admin')
end
def check_blah_role
check_role('blah')
end
Затем в Вашем контроллере Вы просто звонили бы
before_filter :check_admin_role
Существует, вероятно, некоторый способ реализовать это с метапрограммированием, но я - все еще вполне n00b и еще не понял ту часть ;)