2010-02-11 3 views
0

J'ai suivi le official Authlogic tutorial mais quelque chose est apparu.Après le didacticiel Authlogic mais: méthode non définie `email 'pour # <UserSession: {: unauthorized_record =>" <protected> "}>

J'ai créé avec succès un utilisateur, mais lorsque je tente de show sa page de profil, je reçois l'erreur suivante:

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

Voici le code correspondant:

# 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 

Je pense que ce l'ensemble chaîne. Et voici la vue:

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

Lorsque je supprime la ligne « e-mail », je reçois une page avec seulement le lien « Modifier ». Le nom d'utilisateur n'apparaît pas. Toutefois, lorsque j'ajoute <%= debug @user %> pour voir ce qui se passe, il imprime correctement les valeurs pour email et username comme stockées dans la base de données. Je ne sais pas pourquoi il n'imprime pas @user.username, et pourquoi il jette une erreur lorsque j'essaie d'imprimer @user.email. Il convient de noter que show.html.erblayout of the tutorial utilise , et cela fonctionne. Je viens de changer "login" en "nom d'utilisateur".

De plus, lorsque je clique sur "Edit", je reçois la même erreur originale:

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

est ici la mise en page edit et la forme utilisée partielle:

# 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 /> 

Encore une fois, tous pris mot pour mot le tutoriel, ça marche. Je cours Rails 2.3.2 et le dernier Authlogic (juste installé aujourd'hui, n'importe quelle version qui est), et autant que mon cerveau fatigué et frustré peut dire, j'ai tous les champs requis dans la base de données, et they are spelled correctly.

Que se passe-t-il?

Répondre

1

Eh bien, cela est gênant ...

Il se trouve que le problème était ma prédilection pour le langage naturel. Voici la méthode current_user comme prévu dans le tutoriel:

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

Cependant, lors de l'application à mon cas, je troqué && pour and et as a resultcurrent_user_session.user n'était pas prise en compte. C'est pourquoi il ne cessait de dire UserSession ceci et cela. Je pensais que c'était bizarre, mais je ne pouvais pas voir d'où ça venait. Maintenant oui.

0

Je pense que vous voulez avoir le code suivant à la place:

# users_controller.rb  
def show 
    @user = current_user 
end 

Notez que current_user est en fait une méthode plutôt que d'une instance @current_user variable.

+0

La méthode 'current_user' renvoie' @ current_user'. Mais j'ai essayé quand même et rien n'a changé. Mais merci. –

1

Pour l'instant, vous pouvez remplacer

UserSession.create u 

à

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

pas une grosse affaire.

Mais cela m'a pris d'une autre façon. J'ai oublié que mon utilisateur est actif? == false lors de la création. Je l'ai défini sur true et la session est créée.

Questions connexes