ぞえの技術めも

Ruby on Rails勉強中

【177日目】【1日20分のRailsチュートリアル】【第12章】フォローボタン押下時の処理を実装する

Ruby on Railsチュートリアル(第3版)

今日は「12.2.4 [フォローする] ボタン (標準的な方法)」から。

12.2.4 [フォローする] ボタン (標準的な方法)

フォローとフォロー解除はそれぞれリレーションシップの作成と削除に対応しているため、まずはRelationshipsコントローラが必要です。

むしろ今までコントローラ作ってなかったんだ…。そういえば作ってない…。

$ rails generate controller Relationships
      create  app/controllers/relationships_controller.rb
      invoke  erb
      create    app/views/relationships
      invoke  test_unit
      create    test/controllers/relationships_controller_test.rb
      invoke  helper
      create    app/helpers/relationships_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/relationships.coffee
      invoke    scss
      create      app/assets/stylesheets/relationships.scss

今回はまず、コントローラのアクションにアクセスするとき、ログイン済みのユーザーであるかどうかをチェックします。
もしログインしていなければ、ログインページにリダイレクトさせ、Relationshipのカウントが変わっていないことを確認します (リスト12.30)。

コントローラ実装していく前にテストから作成する。

ログインしていない場合はRelationshipコントローラのアクションにアクセスしようとしてもログインページにリダイレクトされるよ、ってテストなのか。

test/controllers/relationships_controller_test.rb

require 'test_helper'

class RelationshipsControllerTest < ActionController::TestCase

  test "create should require logged-in user" do
    assert_no_difference 'Relationship.count' do
      post :create
    end
    assert_redirected_to login_url
  end

  test "destroy should require logged-in user" do
    assert_no_difference 'Relationship.count' do
      delete :destroy, id: relationships(:one)
    end
    assert_redirected_to login_url
  end
end

次に、リスト12.30のテストをパスさせるために、logged_in_userフィルターをRelationshipsコントローラのアクションに対して追加します (リスト12.31)。

今はログイン状態を見てるだけなのでこの対応だけでもテストは通る、と。

app/controllers/relationships_controller.rb

class RelationshipsController < ApplicationController
  before_action :logged_in_user

  def create
  end

  def destroy
  end
end

フォロー/フォロー解除ボタンを動かすためには、フォーム (リスト12.21/リスト12.22) から送信されたパラメータを使って、followed_idに対応するユーザーを見つけてくる必要があります 。その後、見つけてきたユーザーに対して適切にfollow/unfollowメソッド (リスト12.10) を使います。

実装されたもの見るとシンプルな作りだなぁ。

app/controllers/relationships_controller.rb

  def create
    user = User.find(params[:followed_id])
    current_user.follow(user)
    redirect_to user
  end

  def destroy
    user = Relationship.find(params[:id]).followed
    current_user.unfollow(user)
    redirect_to user
  end

これで、フォロー/フォロー解除の機能が完成しました。

テスト通してみる。

$ bundle exec rake test
69 tests, 329 assertions, 0 failures, 0 errors, 0 skips

問題ないね。

次はボタン動くかどうか見てみよう。

サーバーを起動して

$ rails server -b $IP -p $PORT

2番目のユーザーのページにアクセス。
フォローしてないのでフォローボタンが表示されてる。

f:id:kt_zoe:20170906123958p:plain

フォローボタン押すとfollowersの数が増えてフォロー解除ボタンに!上手く動いてそう。

f:id:kt_zoe:20170906124012p:plain

followingページ見てみると、ちゃんと追加されてる。

f:id:kt_zoe:20170906124111p:plain

今日の学習時間は【21分】

次は「12.2.5 [フォローする] ボタン (Ajax)」から。