心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

RailsTutorial4.0を高速で復習する。8.2.5章。

   


8.2.5ユーザー登録と同時にサインインする、です。

ユーザーが登録を行った後、そのユーザーが自動的にサインインするという当たり前の機能を実装します。

テストを書く

リスト8.26 新規ユーザー登録後にユーザーがサインインしたことをテストする。
spec/requests/user_pages_spec.rb

require 'spec_helper'

describe "User pages" do
略
    describe "with valid information" do
略
      describe "after saving the user" do
        before { click_button submit }
        let(:user) { User.find_by(email: 'user@example.com') }

        it { should have_link('Sign out') }
        it { should have_title(user.name) }
        it { should have_selector('div.alert.alert-success', text: 'Welcome') }
      end
    end
  end
end

これ後づけですね。もうviewはこのとおり実装してあるので、テストはパスするはず。と思ったらしなかった。

リスト8.27 ユーザー登録後にサインアップする。
app/controllers/users_controller.rb

class UsersController < ApplicationController
略
  def create
    @user = User.new(user_params)
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end
略
end

ユーザーがログインしたという動作
sign_in @user
を加えました。RSpecって見てくれじゃなくてキチンとプログラム実行してテストしてるんですね。

8.2.6サインアウトする、です。

テストを書く

Sign outをクリックしたらSign inが表示されるというシンプルなテストです。

リスト8.28 ユーザーのサインアウトをテストする。
spec/requests/authentication_pages_spec.rb

require 'spec_helper'

describe "Authentication" do
略
  describe "signin" do
略
    describe "with valid information" do
略
      describe "followed by signout" do
        before { click_link "Sign out" }
        it { should have_link('Sign in') }
      end
    end
  end
end

テストは、destroyがないというエラーになります。まだ実装していません。

Signoutを実装する

リスト8.29 セッションを削除する (ユーザーのサインアウト)。
app/controllers/sessions_controller.rb

class SessionsController < ApplicationController
略
  def destroy
    sign_out
    redirect_to root_url
  end
end

まずは怒られたdestroyの実装から。
いきなりsign_outと書いているので、次はヘルパーとして実装します。

リスト8.30 Sessionsヘルパーモジュールのsign_outメソッド。
app/helpers/sessions_helper.rb

module SessionsHelper

  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end
略
  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end
end

current_userを無しにして:remember_tokenを削除しています。

テストはパスしました。

ちょっとセキュリティが引き続ききになっていますがいったんコミットします。
次は
8.3Cucumberの紹介 (オプション)
です。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
RailsTutorial4.0を高速で復習する。9.2.2章。

9.2.2正しいユーザーを要求する、です。 テストを書く 自分以外の人がプロフィ …

MacにGUIのSQLite3クライアントを入れる。

ターミナルからコマンドたたけばいいだけですが、DBスキーマをちょっと確認したいと …

no image
もう一度、Future Vision

2019年の世界。あと7年。 登場人物に日本人がいない事にも注目してほしい。 関 …

no image
Gitをインストールする

Rails開発がしたいのですが、今後必要になるでしょうからGitをインストールし …

no image
RailsTutorial4.0を高速で復習する。3.3.4章。

3.3.4レイアウトを使って重複を解消する、です。 ここでapplication …

no image
RailsTutorial4.0を高速で復習する。6.2.4章。

6.2.4フォーマットを検証する です。 メールアドレスは文字数制限だけじゃだめ …

no image
Everyday Rails3章 バリデーションをテストする

さっき、Aaronを削除したらテスト失敗することを確認しましたが、名前入力無しの …

no image
iPad vs. VAIO P 持ち歩き編。

旅に出かけるときはケーブルと一緒です。ドコモ携帯、VAIO P、iPhone、W …

no image
RailsTutorial4.0を高速で復習する。3.5章。

3.5章は演習です。3問でています。最初の問題をやります。 1.サンプルアプリケ …

no image
RailsTutorial4.0を高速で復習する。3.2.2章。

静的ページにaboutというページを追加するのですが、rails gを先にするの …