Как пропустить before_filter для SessionsController Devise? - PullRequest
20 голосов
/ 02 июня 2011

У меня есть before_filter в моем ApplicationController;то есть для каждого контроллера в моем проекте.

Как я могу skip_before_filter для Devise SessionsController создать действие?

Ответы [ 7 ]

64 голосов
/ 18 июля 2011

Вот метод, который мой коллега только что показал мне:

# In config/application.rb
module YourAppNameHere
  class Application < Rails::Application
  # Whatever else is already here...

    # The part to add
    config.to_prepare do
      Devise::SessionsController.skip_before_filter :your_before_filter_here
    end
  end
end
19 голосов
/ 18 декабря 2013

У меня недавно была эта проблема с фильтром в моем application_controller Я решил ее, используя skip_before_filter

skip_before_filter :check_subdomain!, if: :devise_controller?
16 голосов
/ 02 июня 2011

Мы сделали что-то вроде этого:

Сначала создайте свой собственный контроллер сеанса, убедитесь, что он наследуется правильно:

class SessionsController < Devise::SessionsController
  skip_before_filter :foobar

Затем исправьте маршруты

devise_for :users,
  :controllers => {
    :sessions => "sessions"
  }

В качестве альтернативы, вы можете установить патч для сессионного контроллера Devise.

2 голосов
/ 06 февраля 2012

Вот еще один способ в lib / devise_sessions_controller_decorator.rb:

module DeviseSessionsControllerDecorator
  extend ActiveSupport::Concern

  included do
    skip_before_filter :your_filter_name
  end
end

Devise::SessionsController.send(:include, DeviseSessionsControllerDecorator)

Так как классы не кэшируются в режиме разработки, вам может потребоваться добавить что-то подобное в config / сред.*

config.to_prepare do
  Devise::SessionsController.send(:include, DeviseSessionsControllerDecorator)
end
1 голос
/ 05 января 2015

Вы можете просто проверить в своем методе фильтра, является ли он разработчиком контроллера.

  if params[:controller] != 'devise/sessions'
1 голос
/ 18 июля 2011

Прежде чем мой коллега показал мне способ, которым я отправил в своем другом ответе, я сделал это. Я публикую это на тот случай, если вы думаете, что это проще.

class ApplicationController < ActionController::Base
  # ...
  before_filter :do_something

  def do_something
    unless params[:controller] == 'devise/sessions'
      # ...
    end
  end
end
0 голосов
/ 02 июня 2011

новый ответ

как насчет оборачивания before_filter в фильтр с блокировкой разве что params[:controller]

def some_before_action
  unless params[:controller] == "sessions_controller_for_devise_name"
      ... #=> do the stuff here
  end 
end

старый ответ

просто авторизуйте, какие действия должны использовать фильтр before

before_filter :action, :only => ...

и авторизуй других.

нашел это здесь

...