44

最新版本的 Devise 默认没有启用 :confirmable。我已经将相应的列添加到 User 模型中,但找不到任何关于如何启用 :confirmable 的代码示例。

我在哪里可以找到一个很好的例子或者我需要什么代码来启用它?

4

6 回答 6

75

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

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 上搜索示例应用程序

于 2011-10-04T21:49:26.507 回答
19

这个问题似乎很奇怪;-) 如果您编写了一些类似的迁移:

    change_table(:users) do |t|
      t.confirmable
    end
    add_index :users, :confirmation_token,   :unique => true

正如您所说,模型几乎没有变化(通过额外的 => :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' %>

此条件检查可确认是否已打开,因此...从技术上讲,如果一切正常,它应该可以正常工作 OOTB。创建新帐户后 - 登录 - 您应该会看到通过适当链接发送确认邮件的行。它触发:

     Rendered devise/mailer/confirmation_instructions.html.erb

所以你有下一个可以自定义的地方

如何自定义确认策略?请提出确切的问题,您想实现什么。您可以检查设计 gem 路径。在 /lib/devise/models/confirmable.rb 中,一些评论可能会有所帮助。

问候

于 2011-01-25T18:18:25.123 回答
17

如果您已经将设计安装到您的应用程序中,并且想稍后添加“可确认”,而不是运行:

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  }
于 2011-09-28T03:09:05.173 回答
9

结帐设计 wiki 页面。你的问题有一个完整的答案。

于 2012-12-10T20:26:20.773 回答
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  }
于 2011-11-06T05:16:03.647 回答
0

配置上述 ActionMailer 设置后,我必须在 config/environments/development.rb 文件中添加最后一个内容,以修复注册新用户后出现的错误页面:

config.action_mailer.default_url_options = { :host => 'localhost' }

有关此解决方案的更多详细信息:Heroku/devise - 缺少要链接的主机!请提供 :host 参数或设置 default_url_options[:host]

于 2015-03-27T22:23:32.603 回答