我跟着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 %>
以查看正在发生的事情时,它会正确打印存储在数据库中的email
和username
的值。我不知道它为什么不打印@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}}
发生了什么事?
答案 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。