Railsでfollow機能を作る

プログラミング学習で定番の課題ですが、follow機能を作ってみます。

今回は掲示板(board)をユーザー(user)がフォローする機能を作ります。

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 %>

参考
railsとjsを使ったお手軽「いいね♡機能」

シェアする

  • このエントリーをはてなブックマークに追加

フォローする