如何使用deviselogin用户?

我有我的轨道应用程序,我遇到了devise的一个主要问题。 我有一个控制器:

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 

问题是它永远不会logging用户,它总是停在这条线上

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

我甚至在实际的gem文件中放入了大量的logging器,看看我能否看到任何东西,但没有,我真的不知道如何解决这个问题。 如果我将这条线注释掉,那么用户就会login,但是如果电子邮件不在数据库中,并且用于任何密码(这肯定不是正确的解决scheme)

我该如何解决?

UPDATE

这工作,但似乎很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 

如果您想login一个用户,请在控制器的操作中使用sign_in助手:

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

我发现这个post对设置请求规格的login很有用。 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 

将其包含在您的spec_helper中

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

并根据需要login

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

Interesting Posts