Как я могу отправить параметр в перед фильтром?

=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"))

0

10
задан Ethan 23 March 2009 в 23:31
поделиться

4 ответа

Необходимо смочь сделать это с блоком:

before_filter {|controller| controller.check_role('admin') }
18
ответ дан 3 December 2019 в 15:22
поделиться

Можно использовать немного метапрограммирования. Что-то вроде этого (полностью непротестированный, просто что-то для давания Вам общее представление о том, как это могло бы пойти):

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.

4
ответ дан 3 December 2019 в 15:22
поделиться

я пытаюсь управлять винтом с молотком?

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 метод, который, кажется, возвращает пробел для меня.

4
ответ дан 3 December 2019 в 15:22
поделиться

Я не полагаю, что можно передать параметры фильтрам. Таким образом, то, что я имею, делают в прошлом, сделано статическими методами, которые передают параметр методу, для которого нужны параметрические усилители.

Таким образом, у меня было бы что-то вроде этого:

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 и еще не понял ту часть ;)

3
ответ дан 3 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: