Следующий учебник Authlogic, но: неопределенный метод `email 'для # <UserSession: {: unauthorized_record =>" <protected>"}> - PullRequest
0 голосов
/ 11 февраля 2010

Я следовал официальному учебнику по , но что-то пришло.

Я успешно создал пользователя, но при попытке 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 руководства использует @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 ]

1 голос
/ 11 февраля 2010

Ну, это смущает ...

Оказывается, проблема была в моем пристрастии к естественному языку. Вот метод current_user, описанный в руководстве:

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

Однако, применяя его к моему делу, я поменял && на and, и в результате current_user_session.user не было учтено. Вот почему он продолжал говорить UserSession то и это. Я думал, что это было странно, но не мог понять, откуда это исходит. Теперь я делаю.

1 голос
/ 10 марта 2011

На данный момент вы можете заменить

UserSession.create u

до

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

не имеет большого значения.

Но это поймало меня по-другому. Я забыл, что мой пользователь стал активным? == ложь при создании. Я установил его в true, и сессия создана.

0 голосов
/ 11 февраля 2010

Я думаю, что вы хотите иметь следующий код:

# users_controller.rb    
def show
  @user = current_user
end

Обратите внимание, что current_user на самом деле является методом, а не переменной экземпляра @ current_user.

...