ruby on rails - rails - ¿Cómo omitir un before_filter para Devise''s SessionsController?
devise wiki (7)
Tengo un before_filter
en mi ApplicationController
; Es decir, para cada controlador en mi proyecto.
¿Cómo puedo skip_before_filter
para la acción de creación SessionsController
de Devise?
nueva respuesta
¿Qué hay de envolver el before_filter en un filtrado de bloque a menos que params[:controller]
def some_before_action
unless params[:controller] == "sessions_controller_for_devise_name"
... #=> do the stuff here
end
end
vieja respuesta
Solo autoriza cuales acciones deben usar el filtro anterior.
before_filter :action, :only => ...
y autoriza a los demás.
Antes de que mi colega me mostrara la forma en que publiqué en mi otra respuesta, hice esto. Estoy publicando esto en caso de que pienses que es más simple.
class ApplicationController < ActionController::Base
# ...
before_filter :do_something
def do_something
unless params[:controller] == ''devise/sessions''
# ...
end
end
end
Aquí hay otra forma en 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)
Debido a que las clases no se almacenan en caché en el modo de desarrollo, es posible que deba agregar algo como esto a config / environment / development.rb:
config.to_prepare do
Devise::SessionsController.send(:include, DeviseSessionsControllerDecorator)
end
Aquí hay un método que mi colega me acaba de mostrar:
# 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
Hicimos algo como esto:
En primer lugar, crea tu propio controlador de sesión, asegúrate de heredar correctamente:
class SessionsController < Devise::SessionsController
skip_before_filter :foobar
Entonces arregla las rutas
devise_for :users,
:controllers => {
:sessions => "sessions"
}
Alternativamente, podrías parchear el controlador de sesión de Devise.
Recientemente tuve este problema con el filtro en mi skip_before_filter
application_controller
lo resolví usando skip_before_filter
skip_before_filter :check_subdomain!, if: :devise_controller?
Simplemente puede verificar en su método de filtro si es un controlador de dispositivo o no.
if params[:controller] != ''devise/sessions''