2017/11/29
Ruby - 使用 Devise confirmable
markdown
## Devise confirmable
我想要認證註冊者的信箱:使用 confirmable
同一個認證連結被點擊第二次會發生什麼事?
當 user 點擊第二次認證信連結時,預設是會顯示「 Email was already confirmed, please try signing in. 」字樣。可以透過自訂 controller 去修改預設行為
怎麼修改認證信內容?
改 template
改 template 路徑
什麼時候會寄出信?
在建立 user 時,會在呼叫 user.save 後寄信給 user。
```
user = User.create()
user.save
```
在編輯 user 時,若 email 有修改,會在呼叫 user.save 後寄信給 user。
```
user = User.find(params[:id])
user.email = 'QQ@QQ'
user.save
```
此時寫入的 email 會被保存到 unconfirmed_email,而原先的 email 欄位在 user 完成認證之前不會改變。
如何測試?加入了 confirmable 之後可能會導致 test fail ,因為 devise 嘗試 send mail 但是 test 環境下沒有設定 host 值。
```
ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
```
開發時的測試方法:
在config/environments/development.rb
```
config.action_mailer.delivery_method = :letter_opener
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```
在config/environments/test.rb
```
config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```
在 rspec
```
user = User.create()
user.save
mail = ActionMailer::Base.deliveries.last
mail.from
mail.to
mail.subject
mail.body.to_s
```
略過 confirm 的方法
```
user = User.create()
user.skip_confirmation!
user.save
```
用 code 完成認證的方法
```
user = User.find(params[:id])
user.confirm
```
## 自定義寄信路徑
```
class DeviseMailer < Devise::Mailer
helper :application # gives access to all helpers defined within `application_helper`.
include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`
def headers_for(action, opts)
super.merge!({template_path: '/users/mailer'}) # this moves the Devise template path from /views/devise/mailer to /views/users/mailer
end
# def confirmation_instructions(record, token, opts={})
# headers["Custom-header"] = "Bar"
# opts[:from] = 'my_custom_from@domain.com'
# opts[:reply_to] = 'my_custom_from@domain.com'
# super
# end
end
```
測試寄信的方法
[http://guides.rubyonrails.org/testing.html#testing-your-mailers](http://guides.rubyonrails.org/testing.html#testing-your-mailers)
阻止修改mail時的認證:[https://coderwall.com/p/7_yh8q/skip-devise-email-confirmation-on-update](https://coderwall.com/p/7_yh8q/skip-devise-email-confirmation-on-update)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言