##自己紹介
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でお気に入り機能を実装するをご覧下さい。
何か、至らない点があれば、ご指摘下さい。