プログラミング学習で定番の課題ですが、follow機能を作ってみます。
今回は掲示板(board)をユーザー(user)がフォローする機能を作ります。
Contents
followモデルを作る
マイグレーションファイルは下記のような感じ作成して、rails db:migrateです。
class CreateFollows < ActiveRecord::Migration[5.0] def change create_table :follows do |t| t.references :user, null: false t.references :board, null: false t.timestamps end end end
ルーティングを設定する
boardモデルの子モデルとしてfollowモデルがあるので、下記のように設定します。フォローしたり外したりするだけですので、一旦は、createとdestroyだけで良いですね。
resources :boards do resources :follows, only: [:create, :destroy] end
followsコントローラーでフォローレコードを作成/削除できるようにする
次はfollowsコントローラーを作成して、followレコードを作成したり削除したりして、フォローを制御します。
class FollowsController < ApplicationController def create follow = Follow.create(user_id: current_user.id, board_id: params[:board_id]) if follow redirect_back(fallback_location: root_path) else redirect_back(fallback_location: root_path) end end def destroy follow = Follow.find_by(user_id: current_user.id, board_id: params[:board_id]) if follow.destroy redirect_back(fallback_location: root_path) else redirect_back(fallback_location: root_path) end end end
クリックしてフォローしたりフォローを外したりできるようにする
今回は、fontawsomeの星マークをクリックしたときにフォローしたり、フォローを外したりできるようにします。
view側で、ユーザー(current_user)がそのboardをフォローしているかどうかを判定する必要があります。viewファイルに長々と判定文を書きたくないので、boardモデルに便利メソッドを定義しておきます。
def follow_user(user_id) follows.find_by(user_id: user_id) end
このメソッドを使って、viewファイルでフォローしているかどうかを判定してリンクをcreateとdestroyで切り替えます。
<% if board.follow_user(current_user.id) %> <%= link_to board_follow_path(board_id: board.id, id: board.follow_user(current_user.id).id), class: "selected", method: :delete do %> <img src="selected_star.png"> <% end %> <% else %> <%= link_to board_follows_path(board.id), class: "selected", method: :post do %> <img src="unselected_star.png"> <% end %> <% end %>
Ruby on Railsをこれから本格的に勉強したい人は「エンジニアになるための600時間のプログラミング学習に耐え抜くコツ」という記事がおすすめです。