tutorial sign_in rails method español ejemplos auth ruby-on-rails ruby ruby-on-rails-3 devise warden

ruby-on-rails - sign_in - rspec rails devise



¿Cómo inicio sesión con un usuario con dispositivo? (3)

Si quiere sign_in sesión en un usuario, use el ayudante sign_in dentro de la acción de su controlador:

sign_in(:user, user)

Tengo mi aplicación de rieles y me encuentro con un gran problema con el dispositivo. Tengo un controlador:

class Users::SessionsController < Devise::SessionsController prepend_before_filter :require_no_authentication, :only => [ :new, :create ] include Devise::Controllers::InternalHelpers def new clean_up_passwords(build_resource) respond_to do |format| format.html { render :layout => "sessions" } format.mobile end end # POST /resource/sign_in def create resource = User.find_by_email(params[:user][:email]) resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new") set_flash_message :notice, :signed_in sign_in_and_redirect(resource_name, resource) end end

El problema es que nunca registra al usuario, siempre se detiene en esta línea

resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")

Incluso puse toneladas de registradores en los archivos reales de gemas para ver si podía ver algo pero nada y realmente no tengo ni idea de cómo solucionarlo. Si comento esta línea, el usuario inicia sesión pero falla si el correo electrónico no está en la base de datos y funciona para cualquier contraseña (que definitivamente no es la solución correcta)

¿Cómo puedo solucionar esto?

ACTUALIZAR

esto funciona pero parece muy hackish

# POST /resource/sign_in def create resource = User.find_by_email(params[:user][:email]) redirect_to(new_user_session_path, :notice => ''Invalid Email Address or Password. Password is case sensitive.'') and return if resource.encrypted_password.blank? bcrypt = BCrypt::Password.new(resource.encrypted_password) password = BCrypt::Engine.hash_secret("#{params[:user][:password]}#{resource.class.pepper}", bcrypt.salt) valid = Devise.secure_compare(password, resource.encrypted_password) # resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new") if valid set_flash_message :notice, :signed_in sign_in_and_redirect(resource_name, resource) else redirect_to(new_user_session_path, :notice => ''Invalid Email Address or Password. Password is case sensitive.'') and return end end


resource = warden.authenticate!(:scope => resource_name) sign_in(resource_name, resource)


Encontré esta publicación útil para configurar un inicio de sesión para especificaciones de solicitud. https://makandracards.com/makandra/37161-rspec-devise-how-to-sign-in-users-in-request-specs

module DeviseRequestSpecHelpers include Warden::Test::Helpers def sign_in(resource_or_scope, resource = nil) resource ||= resource_or_scope scope = Devise::Mapping.find_scope!(resource_or_scope) login_as(resource, scope: scope) end def sign_out(resource_or_scope) scope = Devise::Mapping.find_scope!(resource_or_scope) logout(scope) end end

Incluirlo en su spec_helper

RSpec.configure do |config| config.include DeviseRequestSpecHelpers, type: :request end

E iniciar sesión según sea necesario

sign_in create(:user, name: ''John Doe'')