如何启用:在Devise中确认?

时间:2011-01-24 14:52:40

标签: ruby-on-rails-3 devise confirmation

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

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

6 个答案:

答案 0 :(得分:72)

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

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

请参阅: Adding confirmable module to an existing site using Devise

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

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

您还可以查看设计中的RailsCast:

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

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

答案 1 :(得分:19)

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

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

正如你所说的那样,模型的变化很小(通过额外的=&gt;:确认设计),如下所示:

    devise :database_authenticatable, :registerable, :confirmable

你现在可以生成一些观点(如果你没有')

    rails generate devise:views

您可以转到app / views / devise / confirmations / new.html.erb并查看其外观或更改方式。此外,您可以检查app / views / devise / confirmations / shared / _links.erb =&gt;有行:

    <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>

这个条件检查确认是否打开所以...技术上如果一切正常,它应该工作OOTB。创建新帐户后 - 在日志中 - 您应该看到通过适当的链接发送确认邮件的行。它触发了:

     Rendered devise/mailer/confirmation_instructions.html.erb

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

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

问候

答案 2 :(得分:16)

如果您已经在设计中安装了设备,并希望稍后添加“确认”,而不是运行:

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  }

答案 3 :(得分:8)

结帐devise wiki page。你的问题有一个完整的答案。

答案 4 :(得分: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  }

答案 5 :(得分:0)

配置上述ActionMailer设置后,我必须对config / environments / development.rb文件进行最后一次添加,以修复在注册新用户后显示的错误页面:

config.action_mailer.default_url_options = {:host =&gt; 'localhost'}

有关此解决方案的更多详细信息:Heroku/devise - Missing host to link to! Please provide :host parameter or set default_url_options[:host]