ruby-on-rails - español - rails devise registration controller
Redirigir para iniciar sesión en la página si el usuario no está autenticado con Devise (5)
Agregue este código en config / routes.rb devise_for :users
y resources :users
y puede generar ideas en vistas.
Estoy usando Devise con Ruby on Rails.
¿Cuál es la forma recomendada de redirigir a los usuarios no autenticados a la nueva página de sesiones si intentan acceder a una página que requiere autenticación?
En este momento me sale un error que dice que ninguna ruta coincide con la que intentan acceder (lo que lleva a un error 404 en la producción).
Debe consultar el Cómo hacer: Cómo redirigir a una página específica de Devise cuando el usuario no puede ser autenticado .
Otra alternativa en la que puedo pensar es crear una Restricción de enrutamiento que envuelva sus rutas protegidas. Es mejor que te apegues a la manera de Devise, pero aquí hay un ejemplo:
#On your routes.rb
constraints(Constraints::LoginRequired) do
get ''/example''
end
#Somewhere like lib/constraints/login_required.rb
module Constraints
class LoginRequired
def self.matches?(request)
#some devise code that checks if the user is logged in
end
end
end
Pensé que solo podrías agregar: before_action: authenticate_user! a cada controlador que requirió que el usuario iniciara sesión
Soy un principiante de Rails, pero encontré esto en mis propias búsquedas y funciona bien en mi aplicación.
Puedes hacer lo que GeekTol escribió, o simplemente poner
before_action :authenticate_user!
en tu controlador.
En este caso, idear utiliza el usuario autenticado predeterminado. método, que redireccionará a "user_session_path" y usará el mensaje flash predeterminado.
¡No es necesario reescribir authenticate_user! método, a menos que desee personalizarlo.
Simplemente agregue este método a application_controller.rb
protected
def authenticate_user!
if user_signed_in?
super
else
redirect_to login_path, :notice => ''if you want to add a notice''
## if you want render 404 page
## render :file => File.join(Rails.root, ''public/404''), :formats => [:html], :status => 404, :layout => false
end
end
Y puede llamar a este método en before_filter
otros controladores que desee.
p.ej :
class HomesController < ApplicationController
before_filter :authenticate_user!
## if you want spesific action for require authentication
## before_filter :authenticate_user!, :only => [:action1, :action2]
end
No te olvides de agregar login_path
en routes.rb
devise_scope :user do
match ''/sign-in'' => "devise/sessions#new", :as => :login
end
nota: siempre uso de esta manera cuando juego con el dispositivo para la autenticación de mi aplicación ... (carriles 3.2 y rieles 4.0.1)