【问题标题】:Rails Devise confirmable errorRails 设计可确认的错误
【发布时间】:2017-01-11 20:38:34
【问题描述】:

目前正在尝试将确认邮件与设计身份验证集成。我按照设计文档中的说明进行操作:

https://github.com/plataformatec/devise/wiki/How-To:-Add-:confirmable-to-Users

当我尝试注册一个新用户时,我收到以下错误:

NameError in Devise::RegistrationsController#create
undefined local variable or method `confirmed_at' for #<User:0x9b87b38>

用户.rb

  class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable



  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable
end

rails g 迁移 add_confirmable_to_devise

    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_column :users, :unconfirmed_email, :string # Only if using reconfirmable
    add_index :users, :confirmation_token, unique: true
    # User.reset_column_information # Need for some types of updates, but not for update_all.
    # To avoid a short time window between running the migration and updating all existing
    # users as confirmed, do the following
    execute("UPDATE users SET confirmed_at = NOW()")
    # All existing user accounts should be able to log in after this.
    # Remind: Rails using SQLite as default. And SQLite has no such function :NOW.
    # Use :date('now') instead of :NOW when using SQLite.
    # => execute("UPDATE users SET confirmed_at = date('now')")
    # Or => User.all.update_all confirmed_at: Time.now
  end

  def down
    remove_columns :users, :confirmation_token, :confirmed_at, :confirmation_sent_at
    # remove_columns :users, :unconfirmed_email # Only if using reconfirmable
  end
end

confirmations_controller.rb

class ConfirmationsController < Devise::ConfirmationsController
  private
  def after_confirmation_path_for(resource_name, resource)
    your_new_after_confirmation_path
  end
end

routes.rb

Rails.application.routes.draw do
  devise_for :users, controllers:{ confirmations: 'confirmations'}
  resources :videos
  get 'welcome/index'

  get 'welcome/new'

  root 'welcome#index'



end

我还看到有人说我应该将 gem 'simple_token_authentication 添加到我的 Gemfile 并运行

    rails g migration add_authentication_token_to_users authentication_token:string:index
rake db:migrate

但是,这并没有解决这个问题。

有什么想法吗?谢谢!

【问题讨论】:

  • 检查db/schema.rb 文件以确保表users 具有confirmed_at 列。

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


【解决方案1】:

对于数据库中的每一列,ActiveRecord 创建一个方法来“设置”和“获取”属性(对于类,作为数据库中表示的列),以类上的列命名。在这种情况下,类是 User,列是 confirm_at。

错误消息告诉您的是 User 类上没有方法。您可以通过调用 User.methods 来查看方法。

如果没有看到您最新的 schema.rb 文件,我会假设您错过了 Devise 可确认迁移。

创建一个新的迁移文件,rails g migration AddConfirmableToUsers;前往 db/migrations 并打开相应的迁移文件,然后将其复制粘贴到:

class AddConfirmableToUsers < ActiveRecord::Migration def change change_table(:users) do |t| # Confirmable t.string :confirmation_token t.datetime :confirmed_at t.datetime :confirmation_sent_at t.string :unconfirmed_email # Only if using reconfirmable end add_index :users, :confirmation_token, :unique => true end end

然后调用rake db:migrate

【讨论】:

  • 谢谢!这就是问题所在!为了让它最终发送电子邮件,我需要做些什么吗?因为现在我终于可以再次注册了,但没有发送确认邮件。
  • 没有太多,但魔鬼在细节中。我会查看 mailcatcher.me 以在开发中“发送”邮件(个人偏好;稍后您会明白我为什么要引用“发送”),然后阅读如下内容:richonrails.com/articles/debugging-emails-with-mailcatcher
  • 我会检查的。感谢您提供这么多的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2011-11-18
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多