Документация для условного before_action/before_filter
Вот, a before_filter
:
class ThingController < ApplicationController
before_filter :check_stuff, :if => proc {Rails.env.production?}
end
Во время недавнего обзора кода меня спросили, требуется ли proc
для этого. Ответ кажется "да", но это разумный вопрос, и я намеревался ответить на него, обратившись к документам или руководствам Rails или чему-то об использовании условных выражений с помощью before_filter
(теперь это псевдоним before_action
)..
Я не мог найти. Существует ли (текущее и официальное) руководство или документация, описывающая это использование? В Руководстве по Action Controller упоминается :only
/:except
, но не :if
/:unless
.
В противном случае, есть ли где-нибудь в коде, на который я могу указать, что это покрывает? Он кратко упомянул здесь, но больше о том, как обрабатываются :only
и :except
, а не :if
или :unless
.
Ответы
Ответ 1
Нашел его в Rails Guides: http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks
Оказывается, Proc
не всегда требуется для работы.
параметры :if
и :unless
, которые могут принимать символ, строку, Proc
или Array
.
Итак, в вашем случае вы могли бы уйти с
before_action :check_stuff, if: "Rails.env.production?"
Поиск в документации Rails иногда может быть больно, но по крайней мере такие вопросы облегчают поиск со временем, так как StackOverflow хорошо индексируется и имеет высокий рейтинг поиска.
Ответ 2
Я сделал это на моем коде еще раньше. Надеюсь, этот пример поможет вам. Если вы можете использовать оператор if, но это должно указывать на другой метод, как я сделал здесь.
class Admin::ArticlesController < ApplicationController
before_filter :deny_access, :unless => :draft_and_admin?
def show
@article = Article.find(params[:id])
end
protected
def draft_and_admin?
Article.find(params[:id]).draft? && current_user.admin?
end
end
Ответ 3
Начиная с Rails 5.2, текущий принятый ответ больше не будет действительным, а передача строки к условному завершению завершится с ошибкой.
DEPRECATION WARNING: Передача строки в: if и: если условные параметры не устарели и будут удалены в Rails 5.2 без замены.
Идти вперед, proc - лучший способ добавить условие, как в исходном вопросе:
class ThingController < ApplicationController
before_action :check_stuff, :if => proc {Rails.env.production?}
end