在Authlogic教程之后,但是:#usersession的未定义方法`email':{:unauthorized_record =“”>“<protected>”}&gt; </protected> </usersession:>

时间:2010-02-11 07:27:11

标签: ruby-on-rails authentication forms session authlogic

我跟着official Authlogic tutorial,但出现了一些问题。

我成功创建了一个用户,但当我尝试show他的个人资料页面时,我收到以下错误:

undefined method `email' for #<UserSession: {:unauthorized_record=>"<protected>"}>

以下是相关代码:

# user.rb
class User < ActiveRecord::Base  
  acts_as_authentic do |c|
    c.crypto_provider = Authlogic::CryptoProviders::BCrypt
    c.require_password_confirmation(false)
  end  
  attr_accessible :username, :email, :password  
end

# users_controller.rb    
def show
  @user = @current_user
end

# application_controller.rb
private
  def current_user_session
    return @current_user_session if defined?(@current_user_session)
    @current_user_session = UserSession.find
  end

  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session and current_user_session.user
  end

我认为这就是整个链条。以下是观点:

# views/users/show.html.erb
<%=h @user.username%>
email: <%=h @user.email %>
<%= link_to "Edit", edit_account_path %>

当我删除“电子邮件”行时,我会看到一个只有“编辑”链接的页面。用户名不会出现。但是,当我添加<%= debug @user %>以查看正在发生的事情时,它会正确打印存储在数据库中的emailusername的值。我不知道它为什么不打印@user.username,以及为什么在我尝试打印@user.email时会抛出错误。

应该注意show.html.erb layout of the tutorial使用@user.login,它有效。我刚刚将“登录”更改为“用户名”。

此外,当我点击“编辑”时,我得到相同的原始错误:

undefined method `email' for #<UserSession: {:unauthorized_record=>"<protected>"}>

以下是edit布局和部分使用的表单:

# views/users/edit.html.erb
<h1>Edit My Account</h1>

<% form_for @user, :url => account_path do |f| %>
  <%= f.error_messages %>
  <%= render :partial => "form", :object => f %>
  <%= f.submit "Update" %>
<% end %>
<br />
<%= link_to "My Profile", account_path %>

#views/users/_form.erb
<%= form.label :username %><br />
<%= form.text_field :username %><br />
<br />
<%= form.label :email %><br />
<%= form.text_field :email %><br />
<br />
<%= form.label :password, form.object.new_record? ? nil : "Change password" %><br />
<%= form.password_field :password %><br />
<br />

同样,所有这些都是从教程中逐字逐句完成的,只是有效。

我正在运行Rails 2.3.2和最新的Authlogic(今天刚刚安装,无论是什么版本),而且就我疲惫和沮丧的大脑而言,我确实拥有数据库中的所有必填字段,{ {3}}

发生了什么事?

3 个答案:

答案 0 :(得分:1)

嗯,这很令人尴尬......

事实证明,问题在于我对自然语言的偏爱。这是教程中列出的current_user方法:

def current_user
  return @current_user if defined?(@current_user)
  @current_user = current_user_session && current_user_session.user
end

但是,在将其应用于我的案例时,我将&&换成了and,而as a result current_user_session.user未被考虑在内。这就是为什么它一直说UserSession这个和那个。我觉得这很奇怪,但看不出它来自哪里。现在我做了。

答案 1 :(得分:1)

现在你可以替换

UserSession.create u

UserSession.create :email => u.email, :password => u.password

没什么大不了的。

但这让我感到异常。我忘了我的用户活跃了?创建时== false。我已将其设置为true并创建会话。

答案 2 :(得分:0)

我认为您希望使用以下代码:

# users_controller.rb    
def show
  @user = current_user
end

请注意,current_user实际上是一个方法而不是实例变量@current_user。