2017-12-28 9 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로 지정

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

config.authentication_keys = [:username] 

또 다른 방법을 변경하여 모델을

그런 다음 모델에 검증을 추가

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

그런 다음, 마이그레이션을 만들고 마이그레이션 :

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

다음을 생성하고 사용자 편집 할 때 해당 필드를 설정할 수 있는지 확인하십시오. 최신 버전의 레일에서 strong parameters 기능을 사용하는 경우 컨트롤러에서 해당 파라미터를 .permit(:username)으로 읽는 것을 허용하십시오. 또는 이전 버전의 레일즈를 사용하는 경우 모델에서 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 username or password.' 
not_found_in_database: 'Invalid username or password.' 

을 대신

invalid: "Invalid %{authentication_keys} or password." 
not_found_in_database: "Invalid %{authentication_keys} 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 

당신이 confirmable 또는 recoverable 모듈을 사용하는 경우, 당신은 단지 falseemail_changed?를 정의 할 필요가있다.

관련 문제