自己紹介
9月から独学でプログラミング学習を開始し、
11月からスクールを使って学習をしています。
現在はポートフォリオの作成し転職活動中です。
知識を定着させるために、学びをアウトプットしています。
また、これから学び始める方の参考になることを願っています。
開発環境
- Ruby 3.0
- Ruby on Rails 6.0.3.4
お気に入り機能を実装する
今回はsocializationというgemを使用します。
▼詳しくは公式のGithubはご覧ください。
https://github.com/cmer/socialization
現在、Userテーブルと映画情報を保存するMovieテーブルがあるとします。
まずは、Gemfileに下記を追加します。
gem 'socialization'
追加したら、bundle installを実行し、gemを追加してください。
次に、rails generate socialization -sを実行します。
実行すると、like.rb follow.rb mention.rbのように
モデルが3つとマイグレーションファイルが3つ作成されます。
- class CreateFollows < ActiveRecord::Migration
+ class CreateFollows < ActiveRecord::Migration[6.0]
上記のようにそれぞれのマイグレーションファイルにバージョンを追加します。
そしてrails db:migrateを実行してください。
1.モデルを編集する
それぞれのモデルに下記を追加します。
class Movie < ApplicationRecord
act_as_likeable
end
class User < ApplicationRecord
act_as_liker
end
他にお気に入り機能を追加したいテーブルがある場合は、
同様に、act_as_likeableを追加して下さい。
2.コントローラーを編集する
/controllers/movies_controller.rbを編集します。
class MoviesController < ApplicationController
def favorite
@movie = Movie.find(params[:id])
current_user.toggle_like!(@movie)
end
上記のようにfavoriteを追加しています。
current_userを使用するにはdeviseというgemが必要になります。
今回、deviseについては、省略致します。
socializationを導入したことでuser.toggle_like!(movie)というメソッドが使えるようになりました。
これは、
- お気に入りされていなければ、お気に入り登録をする
- お気に入りされていれば、お気に入りを解除する
このようなメソッドです。
その他のメソッドについては、公式Githubを参照下さい。
3.ルーティングを編集する
favoriteを追加したので/config/routes.rbを編集しましょう。
Rails.application.routes.draw do
resources :movies do
member do
post 'favorite'
end
end
end
メンバールーティングについてはRailsガイドを参照下さい。
https://railsguides.jp/routing.html
4.ビューを編集する
<%= link_to favorite_movie_path do %>
<% if current_user.likes?(movie) %>
お気に入り解除
<% else %>
お気に入り登録
<% end %>
<% end %>
先程、指定したルーティングをlink_toで使用しています。
current_user.likes?(movie)
これは、ユーザーがお気に入り登録しているとtrueを返します。
シンプルですが、基本的な機能の実装は以上です。
しかし、Ajax(非同期処理)でお気に入り登録をしたり、
お気に入りの総数を表示したいと思うかもしれません。
この辺りの実装はAjaxでお気に入り機能を実装するをご覧下さい。
何か、至らない点があれば、ご指摘下さい。