いいね機能の実装

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

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

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

```:ターミナル
rails g model Favorite
```

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

```Ruby: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`は１つのuserは複数のpost、favoriteを持っているような時に記載します

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


```Ruby: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`は１つのpostは１つはuserを持っているような時に記載します。

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

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


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

```Ruby: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`が成功するとテーブルが作成されます。

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

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

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

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

```:ターミナル
rails generate controller Favorites
```

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

```ruby: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アクション

```ruby: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
```

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

```ruby:app/models/post.rb
def favorited?(user)
    favorites.where(user_id: user.id).exists?
end
```
モデルにいいねしているかどうかを判定するメソッドを記入します

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

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

```html: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%>
```

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