心はいつも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
iPhoneのKindleアプリでChip Conley氏の本を読んでみました。その2

iPadの発売がようやく発表されました。私個人としては読書端末としての利用を期待 …

iPadのiBooksで自炊とかしたPDFの電子書籍を読む

手順覚えないのでブログに書きます。 Bookscan使用して手持ちPDF電子書籍 …

アイキャッチ画像のリサイズ

768 × 1024 pxの写真をアイキャッチに指定して、150pxにリサイズ表 …

no image
RailsTutorial4.0を高速で復習する。5.6章。演習3問目。

5章最後の演習、3問目です。 リスト5.38に示すように、元のヘルパーメソッドに …

BiglobeでWimax契約して怒った

久々にダメサービスに遭遇して怒ったので書きます。 BiglobeでWimax契約 …

Macにコマンドラインツールをインストールする

Mac miniのメモリが16Mになったので、気分も新たに、Ruby on Ra …

RailsTutorial4.0を高速で復習する。またまた5.1.2章の途中から。

RailsTutorial4.0を高速で復習する。5.1.2章の途中から。です。 …

初めてのRuby8章「オブジェクトとクラス」

2章「配列とハッシュ」の次はいきなり8章「オブジェクトとクラス」に行ってしまいま …

no image
MavericksアップデートしRuby2.0+Rails4.0.2にversion upする

何を今さら感ですが、MacはAirとMiniの2台持ちです。Airのほうを人柱と …

SublimeText2をMacにインストールしてターミナルから起動できるようにする。

Windowsには秀丸っていう超優秀なテクストエディタがあって、無料でも使えるの …