未定义的方法'make_activation_code'使用Restful_Authentication Rails错误

时间:2009-09-02 11:17:24

标签: ruby-on-rails ruby restful-authentication

我有一个幻想足球联赛的铁杆应用程序去年工作,是时候在赛季开始之前让它再次运行。我清除了数据库并执行了“rake db:migrate”,因此我可以从头开始重新启动应用程序。登录页面出现正常,但当用户尝试使用restful_authentication“注册”时,我在log / production.log中收到以下错误:

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'

以下是我的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 #r@a.wk
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

我的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

make_activation_code在User类中定义,并且在迁移中创建了activation_code,所以我不明白为什么它是未定义的。

3 个答案:

答案 0 :(得分:0)

我无法直接解决如何解决这个问题,但在手头出现异常行为的情况下,我的方法通常是尝试隔离造成问题的原因。在你的情况下,我会尝试创建一个名称不同于“make_activation_code”的方法,看看你是否可以将它添加到before_create并调用它。如果是这样,请在方法中添加当前在make_activation_code中的代码,看看它是否仍然有效。

我在这个特定问题上看到的最接近的现象是Savage Beast插件,其中插件本身有一个User模型,可以重新定义应用程序内的User模型。这就是为什么看看你是否可以为你的before_create添加一个不同的方法并查看它是否被调用会很有趣的原因,这样你就可以验证你的用户模型本身是不是被某个其他部分定义的流氓用户模型所取代。你的应用程序。

测试这一理论的另一种方法是看它在生产中的工作方式是否与开发模式不同。在生产中,模型不会在请求之间重新加载,因此在初始环境加载后,插件中的一个模型/方法的问题不太可能会覆盖另一个模型/方法。

答案 1 :(得分:0)

您是否尝试过对评论保护热线进行评论?

答案 2 :(得分:0)

好的,我找到了问题的答案。我不得不改变before_create,看起来像这样:

  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

一定是Rails的内部变化。