心はいつも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
Ruby 1.9系をインストールする

Rubyのバージョン管理ができるrbenvをインストールしたらいよいよRubyの …

詳解 Objective-C 2.0 第3版 CHAPTER4 オブジェクトの型と動的結合

CHAPTER4は「オブジェクトの型と動的結合」なんだけど、 動的結合ってなに? …

no image
destory

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

no image
Rubyの%を使う記法のうち、 %w

Rubyで%を使う記法は、たのるー(たのしいRuby)によると、以下の6通り % …

no image
RailsTutorial4.0を高速で復習する。4.1章の途中から。

さて、4.1章の途中にある、変だなと思っている箇所、 リスト4.4 Homeペー …

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

6.2.3長さを検証する、です。空データを拒否した次は、入力できるデータ長の制限 …

no image
サイドバーの幅を決めたい(Googleアドセンス編)

サーバー移転したままブログが放置状態になっています。 その間も検索エンジン経由で …

no image
RailsGirlsMore!でRailsTutorialのキモチワルイところがスッキリしました

RailsGirls松江からのぉ〜東京More!*既に2回目から1ヶ月半。またま …

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

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

詳解 Objective-C 2.0 第3版 CHAPTER2 Objective-Cのプログラム

Objective-Cの解説はメッセージから始まる。このメッセージという概念、も …