未定义的方法will_save_change_to_email?

时间:2017-12-28 17:16:24

标签: ruby-on-rails devise

我使用Rails 5.1.4启动了一个应用程序;设计4.2; Mongoid 6.1.0。

当我尝试创建帐户时,我收到了此错误

  

Devise中的NoMethodError :: RegistrationsController #create undefined   方法`will_save_change_to_email?'对于#

我在GitHub上看到一些帖子,但我不知道如何解决这个问题。 https://github.com/plataformatec/devise/issues/4531#issuecomment-313600769

我该怎么办?

2 个答案:

答案 0 :(得分:1)

MonFresh的答案为我做到了

https://github.com/plataformatec/devise/issues/4531#issuecomment-323236400

  

我只记得我们必须重写email_changed吗?并且email_was在我们的应用程序中,因为它不是数据库字段,因此要升级到Rails 5.1,我要做的就是重命名email_changed?到will_save_change_to_email?和email_被发送到email_in_database。

     

不幸的是,这些新的Rails 5.1方法尚未在此处记录:http://api.rubyonrails.org/classes/ActiveModel/Dirty.html,但是您可以在这里阅读有关它们的信息:   rails / rails#25337(评论)

我基本上在Mongoid模型中添加了以下别名(但我认为这与ActiveModel有关)

alias will_save_change_to_email? email_changed?

答案 1 :(得分:0)

如果您不想将电子邮件用作登录的默认字段,则可以指定其他字段。我们将在这些示例中使用: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来访问该字段。

在此之后,您可以使用以下命令生成Devise视图:

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

如果您使用的是confirmablerecoverable模块,则只需将email_changed?定义为false