无法在登录表单上放置电子邮件地址字段(Authlogic)

Tom*_*man 14 authentication ruby-on-rails authlogic

所以我使用这个user_sessions/new视图使Authlogic正常工作:

<% form_for @user_session, :url => user_session_path do |f| %>

  <% if @user_session.errors.present? %>
    Invalid username or password
  <% end %>

  <%= f.label :login %><br />
  <%= f.text_field :login %><br />
  <br />
  <%= f.label :password %><br />
  <%= f.password_field :password %><br />
  <br />
  <%= f.check_box :remember_me, :style => 'margin-right: 10px' %>
  <%= f.label :remember_me %><br />
  <br />
  <%= f.submit "Login" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

但是当我改变的时候

  <%= f.label :login %><br />
  <%= f.text_field :login %><br />
Run Code Online (Sandbox Code Playgroud)

  <%= f.label :email %><br />
  <%= f.text_field :email %><br />
Run Code Online (Sandbox Code Playgroud)

加载视图时出现此错误:

undefined method `email' for #<UserSession: no credentials provided>
Run Code Online (Sandbox Code Playgroud)

但当然我的用户表有一个email字段等.

Sam*_*ron 31

你这是错误的方式:

尝试:

class UserSession < Authlogic::Session::Base 
  find_by_login_method :find_by_login_or_email
end 
Run Code Online (Sandbox Code Playgroud)

并在user.rb中

def self.find_by_login_or_email(login)
   find_by_login(login) || find_by_email(login)
end
Run Code Online (Sandbox Code Playgroud)

您的UserSession没有电子邮件的概念(它只知道登录).

它运行一个查找用户登录的过程,您可以拦截和覆盖(使用find_by_login_method).对于一个额外的好处,你也可以覆盖,login_field并且password_field甚至verify_password_method

  • 很好(这很有道理 - Authlogic病了!) (2认同)

cai*_*ike 18

假设您使用的是用户模型,在Authlogic中使用电子邮件进行身份验证的最简单方法是:

class User < ActiveRecord::Base

  acts_as_authentic do |c|
    c.login_field = 'email'
  end

end
Run Code Online (Sandbox Code Playgroud)