无法在登录表单(Authlogic)中添加电子邮件地址字段

14

所以我已经将Authlogic与此 user_sessions/new 视图成功地配合使用了:

<% 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 %>

但是当我进行修改时

  <%= f.label :login %><br />
  <%= f.text_field :login %><br />
  <%= f.label :email %><br />
  <%= f.text_field :email %><br />

当我加载该视图时,出现以下错误:

undefined method `email' for #<UserSession: no credentials provided>

当然,我的用户表格里有一个email字段等等。

7个回答

31
你的做法有些不对:
试试这样做:
class UserSession < Authlogic::Session::Base 
  find_by_login_method :find_by_login_or_email
end 

并且在 user.rb 文件中

def self.find_by_login_or_email(login)
   find_by_login(login) || find_by_email(login)
end

你的UserSession没有关于电子邮件的概念(它只知道登录信息)。

它会通过查找给定登录信息的用户来运行,你可以通过find_by_login_method拦截和覆盖该过程。作为额外奖励,你还可以覆盖login_fieldpassword_field,甚至是verify_password_method


2
很好(这很有意义——Authlogic非常棒!) - Tom Lehman
同意,我更喜欢它胜过RESTful验证,设计非常稳健。 - Sam Saffron
如果你在User中添加find_by_login_or_email,你可以省略类名。find_by_login(login) || find_by_email(login) - Jared

18

假设您正在使用一个名为“User”的模型,使用电子邮件进行身份验证的最简单方法是:

class User < ActiveRecord::Base

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

end

1
请检查您的user_session是否继承了UserSession < Authlogic::Session::Base,而不是继承ActiveRecord::Base。

0

我可能完全错了,但我相信如果你创建一个具有电子邮件字段而没有登录字段的用户模型,那么Authlogic将使用它作为UserSession。然而,如果您的用户模型具有登录字段,但您没有使用它(即您将视图切换为:电子邮件而不是:登录),则UserSession仍将寻找登录而不是电子邮件,因此您将收到错误消息。

如果您的用户模型没有登录字段,则此问题应该消失,因为Authlogic将默认使用:电子邮件。


0

我曾遇到同样的问题,并发现必须确保登录不在你的模式和数据库中(既然你已经决定像我一样使用电子邮件,你也不需要它)。


-1

我不确定Authlogic的工作原理,但我的猜测与你的结论有些相似。

当然,我的用户表格中有电子邮件字段等。

从这个描述来看,并不一定意味着你的UserSession也有它,是吗?


Authlogic会话是一个模型,它不涉及任何数据库,而是与其作为会话的模型进行交互。 - Aupajo

-2

它说在UserSession中没有电子邮件字段。它不是在查看用户,因为你有:

form_for @user_session

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接