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

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

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

   


9.4.2 destroyアクション、です。

テストを書く

FactoryGirl.create(:admin)を使用してテスト内に管理ユーザーを作成できるようにします。

リスト9.42 管理ユーザー向けのファクトリーを追加する。
spec/factories.rb

FactoryGirl.define do
  factory :user do
    sequence(:name)  { |n| "Person #{n}" }
    sequence(:email) { |n| "person_#{n}@example.com"}
    password "foobar"
    password_confirmation "foobar"

    factory :admin do
      admin true
    end
  end
end

リスト9.43 削除リンクのテスト。
spec/requests/user_pages_spec.rb

require 'spec_helper'

describe "User pages" do

  subject { page }

  describe "index" do

    let(:user) { FactoryGirl.create(:user) }

    before do
      sign_in user
      visit users_path
    end

    it { should have_title('All users') }
    it { should have_content('All users') }

    describe "pagination" do
略
    end

    describe "delete links" do

      it { should_not have_link('delete') }

      describe "as an admin user" do
        let(:admin) { FactoryGirl.create(:admin) }
        before do
          sign_in admin
          visit users_path
        end

        it { should have_link('delete', href: user_path(User.first)) }
        it "should be able to delete another user" do
          expect do
            click_link('delete', match: :first)
          end.to change(User, :count).by(-1)
        end
        it { should_not have_link('delete', href: user_path(admin)) }
      end
    end
  end
略
end

リスト9.46 destroyアクションの保護のテスト。
spec/requests/authentication_pages_spec.rb

require 'spec_helper'

describe "Authentication" do
略
  describe "authorization" do
略
    describe "as non-admin user" do
      let(:user) { FactoryGirl.create(:user) }
      let(:non_admin) { FactoryGirl.create(:user) }

      before { sign_in non_admin, no_capybara: true }

      describe "submitting a DELETE request to the Users#destroy action" do
        before { delete user_path(user) }
        specify { expect(response).to redirect_to(root_path) }
      end
    end
  end
end

実装する

リスト9.44 ユーザー削除用リンク (管理者にのみ表示される)。
app/views/users/_user.html.erb

<li>
  <%= gravatar_for user, size: 52 %>
  <%= link_to user.name, user %>
  <% if current_user.admin? && !current_user?(user) %>
    | <%= link_to "delete", user, method: :delete,
                                  data: { confirm: "You sure?" } %>
  <% end %>
</li>

リファクタリングした箇所ですが、ここに管理者属性ならdeleteが出るようにします。

ブラウザはネイティブではDELETEリクエストを送信できないため、RailsではJavaScriptを使用してこれを偽造します。つまり、JavaScriptがオフになっているとユーザー削除のリンクも無効になるということです。JavaScriptをサポートしないブラウザをサポートする必要がある場合は、フォームとPOSTリクエストを使用してDELETEリクエストを偽造することもできます。こちらはJavaScriptがなくても動作します。詳細についてはRailsCastの「JavaScriptを使用しないで削除する(英語)」を参照してください。

これあとでもう一回勉強したい。

リスト9.45 実際に動作するdestroyアクションを追加する。
app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :signed_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
略
  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User destroyed."
    redirect_to users_url
  end
略
end

リスト9.47 destroyアクションから管理者へのアクセスを制限するbefore_action。
app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :signed_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy
 略
  private
略
    def admin_user
      redirect_to(root_path) unless current_user.admin?
    end
end

9.5最後に、です。
masterにマージしておきます。
git add .
git commit -m “Finish user edit, update, index, and destroy actions”
git checkout master
git merge updating-users

次は
9.6演習、ですがとばして
第10章ユーザーのマイクロポスト、
です。

 - テクニカル ,

Message

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

  関連記事

no image
MacBookAir 1日め

ようやくMacBookAir を購入しました。Dellノートがずっと調子悪かった …

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

6.3セキュアなパスワードを追加する、です。 パスワードはセキュアであるべきと思 …

パーフェクトRuby 2章Rubyの基礎 2-2 変数と定数

p47 2-2-1 ローカル変数 スコープは ・ブロック内 ・メソッド定義内 ・ …

no image
G+ウィジェット設置してみました

(この投稿は別ブログameblo.jp/sweetfからの転載です) G+ウィジ …

詳解 Objective-C 2.0 第3版 CHAPTER3 継承とクラス

[]多用といいメッセージキーワードといい、やっぱObjective-Cってキモチ …

OpneSSL,Readline,Libyamlをインストールする

先ほどインストールしたHomebrewを使って、rbenvをインストールしたいと …

初めてのRuby2章 2.2ハッシュ

ハッシュ ハッシュとは、オブジェクトにキーを対応させたもの。 C++,Javaで …

no image
ToDoの管理方法

東大生はノートがきれいだとか、、 きれいに書いている暇があったら、頭に書いて覚え …

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

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

WordPress子テーマの作り方

デザイン変更したairpucci、TwentyTwelveというWordPres …