【177日目】【1日20分のRailsチュートリアル】【第12章】フォローボタン押下時の処理を実装する
今日は「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番目のユーザーのページにアクセス。
フォローしてないのでフォローボタンが表示されてる。
フォローボタン押すとfollowersの数が増えてフォロー解除ボタンに!上手く動いてそう。
followingページ見てみると、ちゃんと追加されてる。
今日の学習時間は【21分】。
次は「12.2.5 [フォローする] ボタン (Ajax)」から。