使用 Devise 时未定义的方法 confirmed_at
Undefined method confirmed_at when using Devise
我在尝试使用 Devise 的 :confirmable
模块时遇到以下错误:
NameError (undefined local variable or method `confirmed_at' for #<AdminUser:0x007f27841d0f30>)
我的模特:
class AdminUser < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable,:recoverable, :rememberable, :trackable, :validatable, :confirmable
after_create { |admin| admin.send_reset_password_instructions }
def password_required?
new_record? ? false : super
end
end
我想在创建 AdminUser
时发送一封确认邮件。
您将 :confirmable
放入您的 AdminUser 模型中。所以你需要有可确认功能的列,包括 confirmed_at
.
您应该有一个由 Devise 生成的迁移文件。在该文件中,您需要删除 confirmable
列的注释,包括 created_at
.
仅在模型中添加 :confirmable
选项是不够的,您还需要将 Devise 所需的列添加到您的数据库中 table.
假设您使用的模型 AdminUser
:
class AddConfirmableToDevise < ActiveRecord::Migration
def self.up
add_column :admin_users, :confirmation_token, :string
add_column :admin_users, :confirmed_at, :datetime
add_column :admin_users, :confirmation_sent_at, :datetime
add_column :admin_users, :unconfirmed_email, :string
add_index :admin_users, :confirmation_token, :unique => true
end
def self.down
remove_index :admin_users, :confirmation_token
remove_column :admin_users, :unconfirmed_email
remove_column :admin_users, :confirmation_sent_at
remove_column :admin_users, :confirmed_at
remove_column :admin_users, :confirmation_token
end
end
只需运行命令:
rails g migration add_confirmable_to_devise
db/migrate/YYYYMMDDxxx_add_confirmable_to_devise.rb
class AddConfirmableToDevise < ActiveRecord::Migration
# Note: You can't use change, as User.update_all will fail in the down migration
def up
add_column :users, :confirmation_token, :string
add_column :users, :confirmed_at, :datetime
add_column :users, :confirmation_sent_at, :datetime
add_index :users, :confirmation_token, unique: true
execute("UPDATE users SET confirmed_at = NOW()")
end
def down
remove_columns :users, :confirmation_token, :confirmed_at, :confirmation_sent_at
end
end
进一步参考devise
我在尝试使用 Devise 的 :confirmable
模块时遇到以下错误:
NameError (undefined local variable or method `confirmed_at' for #<AdminUser:0x007f27841d0f30>)
我的模特:
class AdminUser < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable,:recoverable, :rememberable, :trackable, :validatable, :confirmable
after_create { |admin| admin.send_reset_password_instructions }
def password_required?
new_record? ? false : super
end
end
我想在创建 AdminUser
时发送一封确认邮件。
您将 :confirmable
放入您的 AdminUser 模型中。所以你需要有可确认功能的列,包括 confirmed_at
.
您应该有一个由 Devise 生成的迁移文件。在该文件中,您需要删除 confirmable
列的注释,包括 created_at
.
仅在模型中添加 :confirmable
选项是不够的,您还需要将 Devise 所需的列添加到您的数据库中 table.
假设您使用的模型 AdminUser
:
class AddConfirmableToDevise < ActiveRecord::Migration
def self.up
add_column :admin_users, :confirmation_token, :string
add_column :admin_users, :confirmed_at, :datetime
add_column :admin_users, :confirmation_sent_at, :datetime
add_column :admin_users, :unconfirmed_email, :string
add_index :admin_users, :confirmation_token, :unique => true
end
def self.down
remove_index :admin_users, :confirmation_token
remove_column :admin_users, :unconfirmed_email
remove_column :admin_users, :confirmation_sent_at
remove_column :admin_users, :confirmed_at
remove_column :admin_users, :confirmation_token
end
end
只需运行命令:
rails g migration add_confirmable_to_devise
db/migrate/YYYYMMDDxxx_add_confirmable_to_devise.rb
class AddConfirmableToDevise < ActiveRecord::Migration
# Note: You can't use change, as User.update_all will fail in the down migration
def up
add_column :users, :confirmation_token, :string
add_column :users, :confirmed_at, :datetime
add_column :users, :confirmation_sent_at, :datetime
add_index :users, :confirmation_token, unique: true
execute("UPDATE users SET confirmed_at = NOW()")
end
def down
remove_columns :users, :confirmation_token, :confirmed_at, :confirmation_sent_at
end
end
进一步参考devise