如何在Devise中启用:confirmable功能?

47

最新版本的Devise默认未启用“:confirmable”功能。我已经向User模型添加了相应的列,但找不到任何启用“:confirmable”的代码示例。

在哪里可以找到好的示例或我需要什么代码来启用它?

6个回答

84

要“启用”确认功能,您只需要将其添加到您的模型中,例如:

class User
  # ...
  devise :confirmable , ....
  # ...
end

接下来,您需要创建并运行一个迁移,将所需的列添加到您的模型中:

# rails g migration add_confirmable_to_devise
class AddConfirmableToDevise < ActiveRecord::Migration
  def self.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

    add_index  :users, :confirmation_token, :unique => true
  end
  def self.down
    remove_index  :users, :confirmation_token

    remove_column :users, :unconfirmed_email
    remove_column :users, :confirmation_sent_at
    remove_column :users, :confirmed_at
    remove_column :users, :confirmation_token
  end
end

请参考以下内容:使用Devise将确认模块添加到现有网站

我建议查看源代码以了解Confirmable的工作原理:

https://github.com/plataformatec/devise/blob/master/lib/devise/models/confirmable.rb

您还可以查看有关 Devise 的 RailsCast:

http://railscasts.com/episodes/209-introducing-devise

接下来最好在GitHub上搜索示例应用程序


这应该被标记为答案,并添加一些来自“https://dev59.com/02445IYBdhLWcg3wmLZd#7577878”的内容(下面的答案)。 - jackyalcine
2
您还需要添加以下行:add_column :users, :unconfirmed_email, :string - Calciphus
这是 Devise 最近的更改吗? - Tilo
谢谢!这帮了我快速在我的应用程序中启用它,只花了大约2分钟。一个提示:如果您在已经注册用户后启用它,则确认可能不会为他们工作(对我来说确实如此)。我重新创建了用户,确认了账户,一切都完美地运行了。 - Kyle Carlson
2
还有这个:如何将:confirmable添加到用户中 - Alexander Popov
从设备GitHub页面的最近Gist来看,似乎不需要未确认的电子邮件,除非使用reconfirmable: # add_column:users,:unconfirmed_email,:string #仅在使用reconfirmable时 - JTE

19
这个问题似乎有点奇怪;-) 如果您编写了一些类似迁移的东西:
    change_table(:users) do |t|
      t.confirmable
    end
    add_index :users, :confirmation_token,   :unique => true

正如你所说,对模型进行小的更改(向devise添加额外的=> :confirmable)如下:

    devise :database_authenticatable, :registerable, :confirmable

现在您可以生成一些视图(如果您没有)

    rails generate devise:views

你可以进入app/views/devise/confirmations/new.html.erb查看其外观或进行更改。此外,您还可以检查app/views/devise/confirmations/shared/_links.erb => 中的代码,其中有一行:
    <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>

这个条件检查确认功能是否已经启用,因此...从技术上讲,如果一切正常,它应该可以直接使用。创建新账户后,在日志中,您应该看到发送确认邮件的行,并带有相应的链接。它会触发:

     Rendered devise/mailer/confirmation_instructions.html.erb

所以你可以在下一个地方自定义它一点

如何自定义确认策略?请问您想要实现什么样的确切问题。您可以检查Devise gem路径。在/lib/devise/models/confirmable.rb中,一些注释可能会有帮助。

祝好


4
需要注意的是,根据V2版本,迁移样式现已过时。 - tibbon

18

如果您已经将Devise安装到您的应用程序中,想要稍后添加“confirmable”,而不是运行:

rails generate devise:views

正如Piotr所提到的,运行

rails generate devise:views confirmable

只生成与“可确认性”相关的视图。你会看到类似以下的输出:

rails generate devise:views confirmable
    invoke  Devise::Generators::SharedViewsGenerator
    create    app/views/confirmable/mailer
    create    app/views/confirmable/mailer/confirmation_instructions.html.erb
    create    app/views/confirmable/mailer/reset_password_instructions.html.erb
    create    app/views/confirmable/mailer/unlock_instructions.html.erb
    create    app/views/confirmable/shared
    create    app/views/confirmable/shared/_links.erb
    invoke  form_for
    create    app/views/confirmable/confirmations
    create    app/views/confirmable/confirmations/new.html.erb
    create    app/views/confirmable/passwords
    create    app/views/confirmable/passwords/edit.html.erb
    create    app/views/confirmable/passwords/new.html.erb
    create    app/views/confirmable/registrations
    create    app/views/confirmable/registrations/edit.html.erb
    create    app/views/confirmable/registrations/new.html.erb
    create    app/views/confirmable/sessions
    create    app/views/confirmable/sessions/new.html.erb
    create    app/views/confirmable/unlocks
    create    app/views/confirmable/unlocks/new.html.erb 

然后,您将能够直接访问这些文件,以便像应用程序一样为其设置样式。 您还将能够通过生成的邮件视图更改Devise发送的电子邮件中的消息。

最后,请不要忘记在您的app/config/environments/{environment_name}.rb文件中添加config.action_mailer.delivery_method和config.action_mailer.smtp_settings。 这是我的production.rb文件的样子:

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address              => "smtp.gmail.com",
    :port                 => 587,
    :domain               => '[redacted]',
    :user_name            => '[redacted]',
    :password             => '[redacted]',
    :authentication       => 'plain',
    :enable_starttls_auto => true  }

不需要像Tilo建议的那样进行迁移吗? - Leahcim
3
这有点偏离主题。这里创建的所有视图都没有用。你只需要:create app/views/confirmable/confirmations create app/views/confirmable/confirmations/new.html.erb create app/views/confirmable/mailer/confirmation_instructions.html.erb - jackyalcine
你好,:domain 的正确设置是什么?它是我的 Heroku 应用程序的域名吗? - Skodik.o

11

2
对于DRY,您也可以将邮件配置放在config/initializers/mail.rb中,例如:
ActionMailer::Base.smtp_settings = {
    :address              => "smtp.gmail.com",
    :port                 => 587,
    :domain               => '[redacted]',
    :user_name            => '[redacted]',
    :password             => '[redacted]',
    :authentication       => 'plain',
    :enable_starttls_auto => true  }

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接