skip_before_filter игнорирует условия - PullRequest
14 голосов
/ 09 января 2011

Я пытаюсь использовать skip_before_filter, только если приложение находится в производственном режиме. (Я не хочу, чтобы мои экземпляры разработки были общедоступными, и я хочу, чтобы приложение автоматически определяло тип экземпляра и отображало экран входа, когда он не находится в рабочем режиме). Итак, мой контроллер приложения имеет следующую строку:

before_filter :authenticate_user!, :except => "sign_in" #redirects to log-in

А контроллер для отображения страниц имеет следующую строку:

skip_before_filter :authenticate_user!, :only => :show, :if => :in_production
#public pages are public, but only when in production.

А in_production это просто:

  def in_production
    ENV['RAILS_ENV']=='production'
  end

Я понимаю, что здесь могут быть другие пути, но мне любопытно, почему skip_before_filter, кажется, игнорирует условное и всегда просто пропускает before_filter. Я что-то упускаю?

Ответы [ 3 ]

19 голосов
/ 05 мая 2013

Это ошибка Rails (или, по крайней мере, недокументированное странное поведение). Отслеживается здесь: https://github.com/rails/rails/issues/9703

В этой теме вы можете найти (искривленное) решение.

Вместо

skip_before_filter :authenticate_user!, :only => :show, :if => :in_production

запись

skip_before_filter :authenticate_user!, :only => :show
before_filter      :authenticate_user!, :only => :show, :unless => :in_production

Это сработало для меня.

7 голосов
/ 13 февраля 2014

Я обнаружил, что решение, опубликованное SmartLove в описанном сценарии, представляет собой своего рода дыру в безопасности или неожиданное поведение. Линия

before_filter :authenticate_user!, :only => :show, :unless => :in_production

из-за :only => :show, переопределяет существующий before_filter, определенный в ApplicationController. Это означает, что все действия этого контроллера (например, редактирование, создание и т. Д.), За исключением: show one, будут опускать authenticate_user! фильтр.

Возможным решением является удаление предложения: only и проверка действия, вызываемого внутри условного метода. Например:

before_filter :authenticate_user!, :unless => :skip_filter?

def skip_filter?
  params[:action] == "show" && in_production
end
4 голосов
/ 09 января 2011

Я не уверен, skip_before_filter принимает параметр :if, поэтому я бы попробовал этот синтаксис

(skip_before_filter :authenticate_user!, :only => [:show]) if in_production

Если он все еще не работает, попробуйте вставить его в контроллер приложения

if ENV['RAILS_ENV']=='production'
  skip_before_filter :authenticate_user!, :only => :show
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...