我使用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
我该怎么办?
答案 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.erb
和app/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
模块,则只需将email_changed?
定义为false
。