2009-09-02 7 views
0

J'ai une application fantasy football league rails qui fonctionnait l'année dernière et il est temps de la relancer avant le début de la saison. J'ai effacé la base de données et fait un "rake db: migrate" afin que je puisse redémarrer l'application à partir de zéro. La page de connexion se présente bien, mais lorsqu'un utilisateur tente de « signer » à l'aide restful_authentication je reçois l'erreur suivante dans le journal/production.log:Méthode indéfinie 'make_activation_code' Rails erreur en utilisant Restful_Authentication

NoMethodError (undefined method `make_activation_code' for #<User:0xb7743490>): 
/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:256:in `method_missing' 
/vendor/rails/activerecord/lib/../../activesupport/lib/active_support/callbacks.rb:173:in `send' 
/vendor/rails/activerecord/lib/../../activesupport/lib/active_support/callbacks.rb:173:in `evaluate_method' 
/vendor/rails/activerecord/lib/../../activesupport/lib/active_support/callbacks.rb:161:in `call' 

Voici quelques extraits de ma classe user.rb:

require 'digest/sha1' 
require 'gravtastic' 

class User < ActiveRecord::Base 
    include Authentication 
    include Authentication::ByPassword 
    include Authentication::ByCookieToken 

# has_one :division 
has_and_belongs_to_many :divisions 

has_gravatar 

validates_presence_of  :login 
validates_length_of  :login, :within => 3..40 
validates_uniqueness_of :login, :case_sensitive => false 
validates_format_of  :login, :with => RE_LOGIN_OK, :message => MSG_LOGIN_BAD 

validates_presence_of  :team_name 
validates_length_of  :team_name, :within => 3..40 
validates_uniqueness_of :team_name, :case_sensitive => false 

# validates_format_of  :name,  :with => RE_NAME_OK, :message => MSG_NAME_BAD,  :allow_nil => true 
# validates_length_of  :name,  :maximum => 100 

validates_presence_of  :email 
validates_length_of  :email, :within => 6..100 #[email protected] 
validates_uniqueness_of :email, :case_sensitive => false 
validates_format_of  :email, :with => RE_EMAIL_OK, :message => MSG_EMAIL_BAD 

before_create :make_activation_code 

# HACK HACK HACK -- how to do attr_accessible from here? 
# prevents a user from submitting a crafted form that bypasses activation 
# anything else you want your user to change should be added here. 
attr_accessible :login, :email, :team_name, :password, :password_confirmation 

fond de mon user.rb:

protected 

def make_activation_code 
    self.activation_code = self.class.make_token 
end 

def make_password_reset_code 
    self.reset_password_code = Digest::SHA1.hexdigest(Time.now.to_s.split(//).sort_by {rand}.join) 
end 

la make_activation_code est définie dans la classe utilisateur et activation_code a été créé dans la migration, donc je ne comprends pas pourquoi est-il défini.

Répondre

0

Ok, j'ai trouvé la réponse à ma question. Je devais changer autour du before_create pour ressembler à ceci:

def before_create 
    self.activation_code = self.class.make_token 
    end 

    def make_password_reset_code 
    self.reset_password_code = Digest::SHA1.hexdigest(Time.now.to_s.split(//).sort_by {rand}.join) 
    end 

doit avoir été un changement interne dans Rails.

0

Je ne pouvais pas parler à la façon de résoudre ce problème directement, mais dans les situations où un comportement anormal est à portée de main, mon approche consiste généralement à essayer d'isoler ce qui cause le problème. Dans votre cas, j'essaierais, par exemple, de créer une méthode avec un nom différent de "make_activation_code", voir si vous pouvez l'ajouter à before_create et qu'il sera appelé. Si c'est le cas, ajoutez le code qui est actuellement dans make_activation_code à l'intérieur de la méthode et voyez si cela fonctionne toujours. Le phénomène le plus proche que j'ai vu à ce problème spécifique est avec le plugin Savage Beast, où le plugin lui-même a un modèle utilisateur qui peut redéfinir le modèle de l'utilisateur dans l'application. C'est pourquoi il serait intéressant de voir si vous pouvez ajouter une méthode différente à votre before_create et voir si elle est appelée, ainsi vous pouvez vérifier que votre modèle User lui-même n'est pas en train d'être remplacé par un modèle utilisateur défini dans une autre partie de votre application Une autre façon de tester cette théorie serait de voir si cela fonctionne différemment en production plutôt qu'en mode développement. En production, le modèle n'est pas rechargé entre les demandes, donc il y a moins de risques de problèmes avec un modèle/méthode dans un plugin remplaçant un autre après la charge de l'environnement initial.

0

Avez-vous essayé de faire des commentaires sur la ligne protégée?

Questions connexes