RubyMine で Rails Tutorial 11章

  •  
  •  
  •  

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 して、ユーザ登録を試してみます。

メールもちゃんと来ました。

リンクを踏んでユーザ登録完了です。ちゃんと動いてますね。