Подтвердить что ты не робот

Документация для условного 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.

4b9b3361

Ответ 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