ihatov08 blog

プログラミング初心者だけどRailsとSwiftマスターします

Railsでいいね!機能の実装方法

GitHub - ihatov08/gatebook

前提としてuserモデルとtweetモデルがあり、アソシエーションをしている。 いいね!機能にはどのuserどのnoteにいいね!をしているのかという2つの情報が必要になる。 例えば

  1. idが1のuser
  2. idが5のtweetにいいね!をしたとき、

  3. user_id: 1

  4. tweet_id: 5

をデータベースに保存する。 これをデータベースでどう実現するか?

user_idtweet_idをカラムとして持つlikesテーブルを作成し、どのuserどのtweetにいいね!したかを保存する。

Likeモデルとマイグレーションファイルの作成

$ rails g model Like user_id:intger tweet_id:intger
$ rake db:migrate

モデル間のアソシエーションを行う。 一人のuserはたくさんのlikeを持つ has_many 1つのlikeは一人のuserに属するので、 belongs_to よってuserとlikeは1対多の関係にある。

user.rb

has_many :likes
#user.likesでuserに紐付いている全てのlikeを取得できる

like.rb

belongs_to :user
like.userでlikeに紐付いているuserを取得できる。

Tweetテーブルとlikesテーブルの関係について。 1つのtweetはたくさんのlikeを持つ has_many 1つのlikeは1つのtweetに属している。 belongs_to よってtweetとlikeも一対多の関係にある。

note.rb

has_many :likes
#note.likesでtweetに紐付いている全てのlikeを取得できる。

like.rb

belongs_to :tweet
#like.tweetでlikeに紐付いているtweetを取得できる。

likeテーブルは中間テーブルと呼ばれる。 ある1人のuserはたくさんのtweetをいいね!でき、ある1つのtweetはたくさんのuserからいいね!される関係が成り立っている。 userとtweetのこの関係を多対多の関係と呼ぶ。

いいねの機能を実装するためにlikesコントローラを作成する。

$ rails g controller likes

ルーティングを設定する。 verbはpostにする。なぜpostにするのか? アドレスバーに直接URLを入力していいね!できないようにするため。 アドレスバーに直接URLを入力するとgetのリクエストになる。 また、いいね!を取り消すunlikeアクションはverbをdeleteにする。

post 'like/:tweet_id' => 'likes#like', as: 'like'
delete 'unlike/:tweet_id' => 'likes#unlike', as: 'unlike'
end
#いいね(または取り消し)をするTweetのidをコントローラに送信。
コントローラではparams[:tweet_id]でこの値を受け取る。

いいね!をするボタンの実装方法 link_toヘルパーを使う。link_toヘルパーはデフォルトでgetになるがmethod: :postを指定して、postでリクエストを送る。 method: :postmethod: 'post'は同じ。

<%= link_to 'いいね!', like_path(@tweet.id), method: :post %>