5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

いいね機能の実装

Posted at

#やりたいこと
投稿に対してユーザーがいいねする機能を実装したい!
今やどのWebサービスにも搭載している機能ですね。
Rails勉強中の方は是非この記事を読んで、
やり方を理解して実装できるようになれるようになってください!!
わからないことがあればコメントお願いします!!

#やり方
##前提
userとpostテーブルがあり、userが親、postが子の親子関係です。

モデル、ルーティング、コントローラー、ビューをそれぞれ説明していきます。
##モデル
###モデル作成
まずFavoriteモデルを作成します
ターミナルから作成しましょう

ターミナル
rails g model Favorite

###モデル編集
その作成されたモデルのファイルにアソシエーションの関係を追記していきましょう

app/models/user.rb
class User < ApplicationRecord
	has_many :posts, dependent: :destroy
	has_many :favorites, dependent: :destroy
end

has_many :posts, dependent: :destroy
has_many :favorites, dependent: :destroyを追記しましょう

has_manyは1つのuserは複数のpost、favoriteを持っているような時に記載します

dependent: :destroyは親のレコードを削除した時に
関連している子供のレコードも全て削除するための記述です。
この記述がある時は、あるuserが削除されるとそのuserが持っているpostを全て削除されます。

app/models/post.rb
class Post < ApplicationRecord
	belongs_to :user
	has_many :favorites, dependent: :destroy
end

belongs_to :user
has_many :favorites, dependent: :destroyを追記しましょう。

belongs_toは1つのpostは1つはuserを持っているような時に記載します。

app/models/favorite.rb
class Favorite < ApplicationRecord
	belongs_to :user
	belongs_to :post
end

belongs_to :user
belongs_to :postを追記しましょう

###マイグレーションファイルの編集
次は、モデルを編集した後はテーブルを作成しましょう
以下の3つのマイグレーションファイルにそれぞれ追記していきましょう

db/migrante/******_create_favorites.rb
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.integer :user_id
      t.integer :post_id
      t.timestamps
    end
  end
end

t.integer :user_id
t.integer :post_idを追記しましょう。

マイグレーションファイル編集後はbundle installをしましょう。

ターミナル
bundle install

bundle installが成功するとテーブルが作成されます。

##ルーティング
まず、ルーティングを以下を追記しましょう。

config/routes.rb
	resources :posts do
		resource :favorites, only: [:create, :destroy]
	end

ターミナル上でrails routesを行いルーティングが通っているか確認しましょう

##コントローラー
まずコントローラーを作成しましょう

ターミナル
rails generate controller Favorites

###favorites_controller
作成されたコントローラーを編集していきます
いいねボタンが押された時に繋がるアクションを記述していきましょう
####createアクション

app/controllers/favorites_controller
def create
	@post_favorite = Favorite.new(user_id: current_user.id,post_id: params[:post_id])
	@post_favorite.save
	result = [done: "save",user_id: current_user.id, post_id: params[:post_id]]
	redirect_to post_path(params[:post_id])
end

####destroyアクション

app/controllers/favorites_controller
def destroy
	@post_favorite = Favorite.find_by(user_id: current_user.id, post_id: params[:post_id])
	@post_favorite.destroy
	result = [done: "destroy",user_id: current_user.id, post_id:params[:post_id]]
	redirect_to post_path(params[:post_id])
end

##ビュー
いいねボタンを投稿の詳細画面に実装していきます
まず、ログインしているユーザーが投稿に対していいねしているかどうかで表示内容を変更します。

app/models/post.rb
def favorited?(user)
    favorites.where(user_id: user.id).exists?
end

モデルにいいねしているかどうかを判定するメソッドを記入します

if @post.favorite?(current_user)
    #ユーザーがいいねしていた時の処理(destroyアクションへのリンク)
else
    #ユーザーがいいねしていない時の処理(createアクションへのリンク)
end

実際にビューファイルに以下の記述を追加していきましょう

app/views/posts/show.html.erb
<%if @post.favorite?(current_user)%>
	<%= link_to post_favorites_path(@post), method: :delete do %>
		<span style="color:red;">❤︎</span>
	<%end%>
<%else%>
	<%= link_to post_favorites_path(@post), method: :post do %>
		<span>❤︎</span>
	<%end%>
<%end%>

疑問、気になるところございました、コメントください!!

5
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?