1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsでお気に入り機能を実装する

Last updated at Posted at 2021-03-01

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?