11章 やります。
メールでアクティベーションするというものですね。
Action Mailer は仕事でも使ったことがあります。監視ツールを作ったことがありまして、メール通知するのに使いました。
ERBで書けるので、これまで進めてきた Web の view と同じような感覚で作れます。
メールのプレビューは知らなかったです。これは便利ですね。
users_login_test.rb のテストが一つ通らなくなりました。
test "login with remembering" do log_in_as(@user, remember_me: '1') assert_equal cookies['remember_token'], assigns(:user).remember_token end
1) Error: UsersLoginTest#test_login_with_remembering: NoMethodError: undefined method `remember_token' for nil:NilClass test/integration/users_login_test.rb:55:in `block in <class:UsersLoginTest>'
リスト 11.32 は 9.3 の課題 でやった assigns() への対応が反映されていないので、そのままだとこのようにエラーになります。
同様にメンバ変数として参照するように修正しておきます。
class SessionsController < ApplicationController def new end def create @user = User.find_by(email: params[:session][:email].downcase) if @user && @user.authenticate(params[:session][:password]) if @user.activated? log_in @user params[:session][:remember_me] == '1' ? remember(@user) : forget(@user) redirect_back_or @user else message = "Account not activated. " message += "Check your email for the activation link." flash[:warning] = message redirect_to root_url end else flash.now[:danger] = 'Invalid email/password combination' render 'new' end end def destroy log_out if logged_in? redirect_to root_url end end
リスト 11.39 はこう書きます。
# アカウントを有効にする def activate update_columns(activated: true, activated_at: Time.zone.now) end
11.40 はこんな感じにしました。
activated が true のものだけを扱うということですね。
def index @users = User.where(activated: true).paginate(page: params[:page]) end def show @user = User.find(params[:id]) redirect_to root_url and return unless @user.activated? end
最後の SendGrid addon は、Heroku にクレジットカードを登録する必要がありました。
Heroku の Manage Account の画面から登録すれば使えるようになります。
config/environments/production.rb を設定します。
Heroku でのアプリケーションのURLを host に設定する必要がありますが、heroku open するとブラウザが開くのでわかりやすいでしょう。
このURLを production.rb に書いておきます。
config.action_mailer.perform_caching = false # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. # config.action_mailer.raise_delivery_errors = false config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp host = 'sleepy-wildwood-37153.herokuapp.com' config.action_mailer.default_url_options = { host: host } ActionMailer::Base.smtp_settings = { :address => 'smtp.sendgrid.net', :port => '587', :authentication => :plain, :user_name => ENV['SENDGRID_USERNAME'], :password => ENV['SENDGRID_PASSWORD'], :domain => 'heroku.com', :enable_starttls_auto => true }
実際に Heroku に deploy して、ユーザ登録を試してみます。
メールもちゃんと来ました。
リンクを踏んでユーザ登録完了です。ちゃんと動いてますね。