0

我有一个去年运行的 Fantasy Football League Rails 应用程序,现在是时候在赛季开始前重新启动它了。我清除了数据库并执行了“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 是在迁移中创建的,所以我不明白为什么它是未定义的。

4

3 回答 3

0

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

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

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

于 2009-09-04T07:15:51.857 回答
0

您是否尝试过注释受保护的行?

于 2009-09-04T11:59:08.320 回答
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 的内部变化。

于 2009-09-05T15:56:16.487 回答