Railsチュートリアル 第11章

11.1 AccountActivations リソース

11.1.1

演習1

省略.

演習2

メールにはフルのURLが記載されていないとアクセスできませんからね.

11.1.2

演習1

省略.

演習2

インスタンスを生成するのは面倒ですが, before_createが機能しているかを確かめましょう. create_activation_digestを呼び出した際のログは一部省略しています.

>> user = User.create(
>*   name: "Console Test",
>*   email: "console@test.com",
>*   password: "password",
>*   password_confirmation: "password")

>> user.create_activation_digest
NoMethodError (private method `create_activation_digest' called for #<User:0x00007fbb70839d60>)

>> user.activation_digest
=> "$2a$10$olzQ9tgFiKu/mrHwP/D5nO8XVyiz1TJ9dSVKO1.lvkc9EAdnSL6cK"

はじめbefore_createの機能を勘違いしていました. Rubyとしてのオブジェクトを作成する前に実行されるものだと思っていました. だから上の演習もUser.newを実行して確認しようとしていました.

しかしここでいうcreateは, データベース操作CRUDのうちのひとつのことだったんですね. だからUser.newではactivation_tokenが作成されませんでした.

11.2 アカウント有効化のメール送信

11.2.1

演習1

以下のようになりました.

>> CGI.escape("Don't panic!")
=> "Don%27t+panic%21"

11.2.2

config/environments/development.rbを編集したあとの再起動は以下のコマンドで行いました.

$ docker-compose restart

ちなみに再起動する前にメールプレビューを見てみましたが, エラーが出ました.

演習1

Date欄には以下の内容が表示されました.

Mon, 02 Jul 2018 04:59:25 +0000

Localeを変更しても特に変化はありませんでしたね.

11.2.3

演習1, 2

省略.

11.2.4

演習1

Railsサーバーが起動しているコンテナの標準入出力をローカルマシンのターミナルにアタッチします.

$ docker attach <container id or name>

この状態で新規ユーザー登録をすると, メール送信のログを見ることができます.

終わったら

Ctrl+P, Ctrl+Q

を押してデタッチをしましょう. 間違ってCtrl+D等でコンテナを抜け, コンテナが落ちてしまった場合はこちらを参考にしてください.

演習2

省略.

11.3 アカウントを有効化する

11.3.1

演習1, 2

こんな感じです.

>> user = User.create(
>*   name: "Activation Test",
>*   email: "activation@test.com",
>*   password: "password",
>*   password_confirmation: "password")

>> token = user.activation_token
=> "Pr4fTMDEgwnsh4rTUSsQiA"
>> user.authenticated?(:activation, token)
=> true

11.3.2

演習1, 2

省略.

11.3.3

演習1, 2

簡単なので省略.

演習3

アクティベートされていないユーザーをfixture内に作成しました.

# test/fixtures/users.yml

non_activated:
  name: Non Activated
  email: non_active@example.com
  password_digest: <%= User.digest('password') %>

統合テスト用の新しいクラスを作成すべきなのか, 不勉強なため判断がつきませんでした. すくなくともusers/indexページには関連したテストなので, users_index_test.rbに書くことにしました.

# test/integration/users_index_test.rb

def setup
    @admin = users(:michael)
    @non_admin = users(:archer)
    @non_activated = users(:non_activated)
end

test "should not show non-activated user" do
    log_in_as(@admin)
    get users_path
    assert_select 'a[href=?]', user_path(@non_activated), count: 0

    get user_path(@non_activated)
    assert_redirected_to root_url
end

11.4 本番環境でのメール送信

この節はやっていません.