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)

沒有留言: