Railsでいいね!機能の実装方法
前提としてuserモデルとtweetモデルがあり、アソシエーションをしている。
いいね!機能にはどのuser
がどのnote
にいいね!をしているのかという2つの情報が必要になる。
例えば
をデータベースに保存する。 これをデータベースでどう実現するか?
user_id
とtweet_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: :post
とmethod: 'post'
は同じ。
<%= link_to 'いいね!', like_path(@tweet.id), method: :post %>