У меня есть before_filter
в моем ApplicationController
; то есть для каждого контроллера в моем проекте.
Как я могу skip_before_filter
для Devise SessionsController
создать действие?
У меня есть before_filter
в моем ApplicationController
; то есть для каждого контроллера в моем проекте.
Как я могу skip_before_filter
для Devise SessionsController
создать действие?
Мы сделали что-то вроде этого:
Сначала создайте свой собственный контроллер сеанса, убедитесь, что наследуете правильно:
class SessionsController < Devise::SessionsController
skip_before_filter :foobar
Затем зафиксируйте маршруты
devise_for :users,
:controllers => {
:sessions => "sessions"
}
В качестве альтернативы вы можете настроить контроллер сеанса обезьяны-патча.
Вот метод, который мой коллега только что показал мне:
# 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
Недавно у меня была эта проблема с фильтром в моем application_controller
, я решил его с помощью skip_before_filter
skip_before_filter :check_subdomain!, if: :devise_controller?
Здесь другой путь в 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/environment/development.rb:
config.to_prepare do
Devise::SessionsController.send(:include, DeviseSessionsControllerDecorator)
end
Прежде чем мой коллега показал мне, как я опубликовал в своем другом ответе, я сделал это. Я публикую это на случай, если вы считаете это более простым.
class ApplicationController < ActionController::Base
# ...
before_filter :do_something
def do_something
unless params[:controller] == 'devise/sessions'
# ...
end
end
end
Вы можете просто проверить свой фильтр, независимо от того, разрабатывает ли он контроллер или нет.
if params[:controller] != 'devise/sessions'
как насчет обертывания файла 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 => ...
и разрешить другим.