0


0

私は去年働いていたファンタジーフットボールリーグレールアプリを持っています、そしてそれはシーズンが始まる前にそれが再び軌道に乗る時間です。 データベースをクリアして「rake db:migrate」を実行して、アプリを最初から再起動できるようにしました。 ログインページは問題なく表示されますが、ユーザーがrestful_authenticationを使用して「サインアップ」しようとすると、log / production.logに次のエラーが表示されます。

NoMethodError(#の未定義メソッド `make_activation_code '):/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/../../ active / support / lib / active_support / callbacks.rb:173:in` evaluate_method' / vendor / rails / activerecord /lib/../../activesupport/lib/active_support/callbacks.rb:161:in `call '

これが私のuser.rbクラスからの抜粋です。

'ダイジェスト/ sha1'が必要 'gravtastic'が必要

class User <ActiveRecord :: Base include認証include認証:: ByPassword include認証:: 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:チーム名validates_length_of:チーム名、:within => 3..40 validates_uniqueness_of:チーム名、: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:Eメールvalidates_length_of:Eメール、:within => 6..100 #[email protected] validates_uniqueness_of:Eメール、:case_sensitive => false validates_format_of:Eメール、:with => RE_EMAIL_OK、:message => MSG_EMAIL_BAD

before_create:make_activation_code

#HACK HACK HACK  - ここからattr_accessibleをする方法? #ユーザーがアクティベーションを回避するような細工されたフォームを送信できないようにする#ユーザーが変更したいものはここに追加する必要があります。 attr_accessible:login、:email、:team_name、:password、:password_confirmation

私のuser.rbの一番下:

保護された

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)

make_activation_codeはUserクラスで定義され、activation_codeは移行で作成されたので、なぜそれが未定義であるのかわかりません。

3 Answer


0


私はこの問題を直接解決する方法について話すことができませんでしたが、異常な行動が手元にある状況では、私のアプローチは通常問題の原因を突き止めることを試みることです。 あなたの場合は、 "make_activation_code"とは異なる名前のメソッドを作成するなどしてみてください。before_createに追加できるかどうかを確認してください。 そうであれば、現在make_activation_codeにあるコードをメソッド内に追加し、それがまだ機能するかどうかを確認します。

私がこの特定の問題に最もよく見た現象はSavage Beastプラグインにあります。そこでは、プラグイン自体がアプリケーション内でユーザーモデルを再定義できるユーザーモデルを持っています。 そのため、before_createに別のメソッドを追加してそれを呼び出すことができるかどうかを確認することが興味深いので、Userモデル自体が何らかの形で他の部分で定義された不正なUserモデルに置き換えられないことを確認できます。あなたのアプリの。

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


0


保護された行をコメントアウトしてみましたか?


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の内部的な変更でなければなりません。