Railsアプリに「いいね機能」を実装する方法は??
Railsアプリでやってみたいのが「いいね機能」の実装です。
「いいね機能」がないアプリは死んだも同然。
ほぼすべてのアプリにいいね機能がついていますから。
今日は「いいね機能」をRailsアプリで実装する方法をまとめておきました。
例として「user」と「tweet」モデルを使って、userがある任意のtweetにいいねできる機能をつけていきます。
まず、基本的な実装方法からですね。
likeモデル作成
まずは「いいね(like)」モデルの作成です。
- user_id(integer)
- tweet_id(integer)
のプロパティを持ったモデルを作ります。
コマンドは
$ rails g model like tweet_id:integer user_id:integer
ですね。
それが終わったら、最後に
$ rails db:migrate
を発動してデータベースを更新。
コントローラーを作成
いいね用のコントローラーを手動で作りましょう。
likes_controller.rb
ですね。
ファイル階層のapp > controllersにぶちこみます。
ルーティングを設定
ルーティングは次のように設定しましょう。
post "likes/:tweet_id/create" => "likes#create" post "likes/:tweet_id/destroy" => "likes#destroy"
ポイントはgetではなくpostになっている点ですね。
いいねすると、データベース値が変化するので、postを採用しました。
コントローラーにアクションを追加
空っぽのコントローラーにアクションを追加。
ルーティングでも出てきましたが、今回は
- create
- destroy
の2アクションです。
それぞれこのようになってますね。
def create @like = Like.new(user_id: @current_user.id, tweet_id: params[:tweet_id]) @like.save redirect_to("/tweets/#{params[:tweet_id]}") end def destroy @like = Like.find_by(user_id: @current_user.id, tweet_id: params[:tweet_id]) @like.destroy redirect_to("/tweets/#{params[:tweet_id]}") end
いいねボタンを表示
最後にいいねボタンを表示します。
すでにいいねしたユーザーかどうかによって、表記とリンク先を切り替え。
<% if Like.find_by(user_id: @current_user.id, tweet_id: @tweet.id) %> <%=link_to("いいね!済み", "/likes/#{@tweet.id}/destroy", {method: "post"})%> <% else %> <%= link_to("いいね!", "/likes/#{@tweet.id}/create", {method: "post"}) %> <% end %>
「いいねをしたuser_id」と「ログイン中のuser_id」が一致するかで条件分岐させます。
いいね数をカウントしたい時はどうする?
いいね数をカウントできると面白いですね。
ここではcountメソッドを使います。
tweets_controller.rbのshowアクションで、変数@like_countを定義。
likeのtweet_idが@tweet.idと一致したものをwhereメソッドで取得したものを代入します。
それをtweetのビューファイルshow.html.erbにて、
<%=@likes_count%>
で表示させれば、いいね数のカウントが出てくるでしょう。
いいねを一覧で表示する
いいねしたデータを一覧で表示したい??
そういう時は次のステップを踏むと良いですよ。
ルーティングを設定する
新しくuserのルーティングを追加です。
get "users/:id/likes" => "users#likes"
アクションを追加
次はアクションを追加。
userコントローラーにlikesアクションを追加します。
def likes @user = User.find_by(id: params[:id]) @likes = Like.where(user_id: @user.id) end
ビューファイル追加
最後にビューファイルです。
新しくuserのフォルダ内に
likes.html.erb
を作って、そこにlikeしたtweetを表示しましょう。
<% @likes.each do |like|%> <!-- 変数tweetを定義してください --> <%= tweet = tweet.find_by(id: like.tweet_id) %> <% end%> <div class="tweets-index-item"> <div class="tweet-left"> <img src="<%= "/user_images/#{tweet.user.image_name}" %>"> </div> <div class="tweet-right"> <div class="tweet-user-name"> <%= link_to(tweet.user.name, "/users/#{tweet.user.id}") %> </div> <%= link_to(tweet.content, "/tweets/#{tweet.id}") %> </div> </div> <!-- each文のendを追加してください --> <% end %>
いいねしたデータ一覧を表示できましたね?
Railsアプリを作ったら、いいね機能の実装にもチャレンジしましょう。
それでは!
Lin

おそらく、ブロガー。
今年でフリーランス 6年目。