2017-12-28 8 views
0

私はRails 5.1.4でアプリケーションを開始しました。デビーズ4.2;モンゴイド6.1.0。未定義のメソッドwill_save_change_to_email?

私はアカウントを作成しようとすると、私が考案でこのエラー

NoMethodError :: RegistrationsController#は未定義 メソッド `will_save_change_to_emailを作成しました?」 #

GitHubについての投稿がありますが、その修正方法はわかりません。 https://github.com/plataformatec/devise/issues/4531#issuecomment-313600769

どうすればよいですか?

答えて

1

電子メールをサインインのデフォルトフィールドとして使用したくない場合は、別のフィールドを指定することができます。これらの例ではフィールド名として:usernameを使用しますが、任意のフィールドを使用できます。これを実装するために

config/initializers/devise.rbファイルに次のテキストのコメントを解除し、あなたがそのような:usernameなど、サインイン時に使用するフィールドを指定します。

config.authentication_keys = [:username] 

もう一つの方法は、モデルを変更することです:

devise :database_authenticatable, :authentication_keys => [:username] 

次に、モデルに検証を追加します。

validates :email,uniqueness: true validates :username,uniqueness: true

次に、移行を作成して移行:

rails generate migration add_username_to_users username:string:uniq rake db:migrate

次に、あなたが作成したときにそのフィールドを設定し、ユーザーを編集することができますことを確認してください。より新しいバージョンのRailsでstrong parameters機能を使用する場合は、コントローラ内のそのパラメータの読み取りを.permit(:username)で許可してください。古いバージョンのRailsを使用している場合は、代わりにattr_accessible :usernameというモデルでフィールドにアクセス可能にしてください。

rails generate devise:views 

をそして、あなたは新しいフォームフィールドを使用するapp/views/devise/sessions/new.html.erbapp/views/devise/registrations/new.html.erbでビューを変更する必要があります:

この後は、次のコマンドを使用して考案ビューを生成することができます。

最後に、ユーザーが誤った資格情報を提供する場合、または見つからない場合に表示されるエラーメッセージを変更する必要があります。これはconfig/locales/devise.en.ymlで行います。次を探します。

invalid: 'Invalid email or password.' 
not_found_in_database: 'Invalid email or password.' 

と、このように変更します。あなたは

invalid: "Invalid %{authentication_keys} or password." 
not_found_in_database: "Invalid %{authentication_keys} or password." 

が表示された場合

invalid: 'Invalid username or password.' 
not_found_in_database: 'Invalid username or password.' 

代わりに、あなたは何も変更する必要はありません。

電子メールを認証キーとして使用していない場合、ユーザーが同じ電子メールアドレスを持つ複数のアカウントを持つ可能性があります。これにより、 "リカバリ可能な"モジュールはうまく動作しません。これは、一致する電子メールを見つけた最初のアカウントへのパスワードリセット電子メール内のリンクのみを含むためです。すべてのアカウント情報をパスワードリセット電子メールに追加する実装方法については、a thread on the Google Groupです。

重要な注意:あなたはvalidatableモジュールを使用する場合は、email_required?email_changed?を定義します。

# app/models/model.rb 
class Model < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, 
     :trackable, :lockable, :validatable 

    def email_required? 
    false 
    end 

    def email_changed? 
    false 
    end 

    # use this instead of email_changed? for rails >= 5.1 
    def will_save_change_to_email? 
    false 
    end 

end 

あなたがconfirmablerecoverableモジュールを使用している場合は、あなただけのfalseemail_changed?を定義する必要があります。