【问题标题】:Undefined method confirmed_at when using Devise使用设计时未定义的方法confirmed_at
【发布时间】:2015-10-30 09:40:08
【问题描述】:

我在尝试使用 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 时发送一封确认邮件。

【问题讨论】:

    标签: ruby-on-rails ruby devise devise-confirmable


    【解决方案1】:

    仅在模型中添加:confirmable 选项是不够的,您还需要将设计所需的列添加到数据库表中。

    假设您使用的是模型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
    

    【讨论】:

    • 你加了 :confirmation_token 两次。是一样的还是不一样的?
    • 第二个是索引——数据库确保每个令牌都是唯一的一种方式
    • 根据经验,对于一个对象来说“无法识别的方法”的错误通常意味着缺少数据库列 ;-)
    【解决方案2】:

    只需运行命令:

    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

    【讨论】:

    • sqlite3 中的NOW() 怎么说?
    【解决方案3】:

    您将 :confirmable 放入您的 AdminUser 模型中。所以你需要有可确认功能的列,包括confirmed_at

    您应该有一个由 Devise 生成的迁移文件。在该文件中,您需要删除 confirmable 列的注释,包括 created_at

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多