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

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

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

   


9.2.2正しいユーザーを要求する、です。

テストを書く

自分以外の人がプロフィル変更できないテストを書きます。自分以外でログインし、キチンとメッセージだでたりリダイレクトされたりを確認します。

リスト9.14 editアクションとupdateアクションで正しいユーザーを要求することをテストする。
spec/requests/authentication_pages_spec.rb

require 'spec_helper'

describe "Authentication" do
略
  describe "authorization" do
略
    describe "as wrong user" do
      let(:user) { FactoryGirl.create(:user) }
      let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
       before do
        visit signin_path
        fill_in "Email",    with: user.email.upcase
        fill_in "Password", with: user.password
        click_button "Sign in"
      end

      describe "submitting a GET request to the Users#edit action" do
        before { get edit_user_path(wrong_user) }
        specify { expect(response.body).not_to match(full_title('Edit user')) }
        specify { expect(response).to redirect_to(root_url) }
      end

      describe "submitting a PATCH request to the Users#update action" do
        before { patch user_path(wrong_user) }
        specify { expect(response).to redirect_to(root_path) }
      end
    end
  end
end

リスト9.6 ユーザーがサインインするためのテストヘルパー。
spec/support/utilities.rb

.
.
.
def sign_in(user, options={})
  if options[:no_capybara]
    # Capybaraを使用していない場合にもサインインする。
    remember_token = User.new_remember_token
    cookies[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
  else
    visit signin_path
    fill_in "Email",    with: user.email
    fill_in "Password", with: user.password
    click_button "Sign in"
  end
end

ずっとテストヘルパー使わずにやってましたが、ここでno_capybara optionで実行するために使いました。
納得いっていません。RSpec要勉強です。

実装する

リスト9.15 edit/updateページを保護するためのcorrect_user before_action。
app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :signed_in_user, only: [:edit, :update]
  before_action :correct_user,   only: [:edit, :update]
略
  def edit
  end

  def update
    if @user.update_attributes(user_params)
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end
略
  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

    # Before actions

    def signed_in_user
      redirect_to signin_url, notice: "Please sign in." unless signed_in?
    end

    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_path) unless current_user?(@user)
    end
end

いったんコミットしておきます。
次は
9.2.3フレンドリーフォワーディング
です。

 - テクニカル ,

Message

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

  関連記事

初めてのRuby8章 8.2変数と定数

8.2 変数と定数 8.2.1 インスタンス変数 @で始まるのがインスタンス変数 …

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

10.1.4マイクロポストを改良する、です。 has_many関連付けしたので、 …

no image
iPhoneのKindleアプリでChip Conley氏の本を読んでみました。その2

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

詳解 Objective-C 2.0 第3版

Rubyの言語仕様を勉強する傍ら、Objective-Cも言語仕様ベースで勉強し …

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

3.2章は最初のテストです。 Railsチュートリアルは、アプリケーションの振る …

文字化けもするし、、

自作テンプレ作ったはいいですが、問題が、、。 関連しそうな記事 iTunesをM …

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

7.1.2ユーザーリソース、です。 /user/newを/signupで表示させ …

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

テストコードが長くなったからリファクタリングするかも、、といいながら、静的ページ …

no image
Ruby 1.9系をインストールする

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

パーフェクトRuby 2章Rubyの基礎 2-8 様々な代入式

p66 2-8-1 多重代入 まとめて代入する横着なやり方。 a,b = 1,2 …