首先在专案上装上devise
bundle add devise
rails generate devise:install
安装好后用devise 建立 User
rails generate devise User
建立好后输入rails db:migrate
...才怪,已经输入的请用rails db:rollback
退回去。
在上面图片可以看到devise帮我们建立了一个migration档案
来到Confirmable这里把他解开
现在可以rails db:migrate
来到models/user.rb
在 devise那行最后加上,:confirmable
devise :database_authenticatable, :registerable,:recoverable, :rememberable, :validatable,:confirmable
接下来就是设定信箱
1.development
在/config/environments/development.rb
把false改成true(测试寄信错误的时候可以马上显示错误)
config.action_mailer.raise_delivery_errors = true
然后加上这两行
config.action_mailer.default_url_options = { host: "http://localhost:3000" }config.action_mailer.smtp_settings = config_for(:email).symbolize_keys
在 config/ 底下新增 email.yml(记得把它加到 .gitignore )
我自己使用mailgun寄信
development: address: "smtp.mailgun.com" port: 587 domain: "mailgun.com" authentication: "plain" user_name: "你的email帐号" password: "你的email密码" enable_starttls_auto: true
2.production
在/config/environments/production.rb
config.action_mailer.raise_delivery_errors = false #测试可改true,但如果已上线的话建议改回falseconfig.action_mailer.default_url_options = { host: ENV["WEB_PATH"]} #production的绝对网址config.action_mailer.delivery_method = :smtpconfig.action_mailer.smtp_settings = { address: "smtp.mailgun.com", port: 587, domain: "mailgun.com", authentication: "plain", user_name: ENV["MAILGUN_USERNAME"], password: ENV["MAILGUN_PASSWORD"], enable_starttls_auto: true }
3.devise
在config/initializers/devise.rb
config.mailer_sender = '<info@example.com>' #改成你想显示的寄件者config.mailer = 'Devise::Mailer' #将#字号删除
到这里就完成了,在注册帐号后会收到验证信,忘记密码会收到修改信。
小结
做完后我多了好几个问题
1.User在Email验证前后的变化,devise在背后做了什么才会达到验证效果?
2.confirmation_token做了什么?
3.修改密码时reset_password_token是怎么做到有时效性的?
参考资料:
https://github.com/heartcombo/devise
Devise 忘记密码寄信实作