0

昨年機能していたファンタジーフットボールリーグのRailsアプリがあり、シーズンが始まる前に再び実行する時が来ました。データベースをクリアして「rakedb: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に別のメソッドを追加して呼び出されるかどうかを確認し、ユーザーモデル自体が他の部分で定義された不正なユーザーモデルに置き換えられていないことを確認できるのは興味深いことです。あなたのアプリの。

この理論をテストする別の方法は、本番環境と開発モードで動作が異なるかどうかを確認することです。本番環境では、モデルはリクエスト間でリロードされないため、初期環境のロード後にプラグイン内の1つのモデル/メソッドが別のモデル/メソッドをオーバーライドする問題が発生する可能性は低くなります。

于 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 に答える