📝

rails お気に入り機能の実装をしてみた

2021/01/14に公開

みなさん、こんばんは!
オリジナルアプリの機能追加でお気に入り機能を追加しました。
ajaxで実装したかったけど、とりあえず普通に実装したので、自分の記録用として置いておきます!

モデルの作成

お気に入り機能のモデルを作成
いいね機能にするか迷っていたので、どっちにも対応できるようにlike modelにした

rails g model like 

続いてマイグレーションファイルの編集

 def change
    create_table :likes do |t|
      t.references :user, foreign_key: true
      t.references :record, foreign_key: true
      t.timestamps
     
    end
  end
  

※一意性制約にするべきだったけど、何を試してもエラーになったので、とりあえずこのまま実装しました。

続いてルーティング

resources :records do
  resources :comments, only: [:create, :destroy]
  resource :likes, only: [:create, :destroy]
 end

コントローラー

def create
   like = current_user.likes.build(record_id: params[:record_id])
   if like.save
    redirect_back(fallback_location: root_path)
   else
     @record = like.record
     like = @record.likes
     redirect_back(fallback_location: root_path)
   end
 end
 
 def destroy
   user=current_user
   record=Record.find(params[:record_id])
   if like=Like.find_by(user_id: user.id,record_id:record.id)
    like.destroy
    redirect_back(fallback_location: root_path)
   else
    redirect_back(fallback_location: root_path)
   end
 end

※なんかコードが汚い
すべての機能やビューが整ったらリファクタリングをしよう

つづいてビューファイル

<% if user_signed_in?  %>
   <div class="option" >
     <div class="favorite-btn">
       <%= image_tag "star.png" ,class:"favorite-star-icon" ,width:"20",height:"20"%>
       <p><span>お気に入り登録: </span><%=link_to @record.likes.count, record_likes_path(@record.id), method: :post %></p>
     </div>
     <div class="report-btn">
       <%= image_tag "flag.png" ,class:"report-flag-icon" ,width:"20",height:"20"%>
       <p><span>お気に入り解除: </span><%=link_to @record.likes.count, record_likes_path(@record.id), method: :delete %></p>
     </div>
     <div class="count-btn">
       <p><span>お気に入りされた数: </span><%= @record.likes.count %></p>
     </div>
     <% else %>
       <p>※※※お気に入りをするにはユーザー登録をしましょう※※※</p>
     <% end %>
   </div>
   

ログインしていないとお気に入り機能がでてこないように記述

完成品はこちら

今日の気づき

まだまだ自作のメソッド作って記述を減らしたり、応用を帰化していくのが苦手。。
動けばいいってわけではない。
ただ検索して調べる力はついてきたかな。
修練あるのみ。

次回予告

kaminariを利用してページネーションにチャレンジするとかしないとか。。

Discussion