0
2

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.

非同期通信でいいね機能実装してみた

Last updated at Posted at 2021-01-11

今回は非同期通信を用いてのいいね機能を実装していきたいと思います。

##下準備
①favoriteコントローラーを追加

 $rails g controller Favorites

②ルーティング設定

routes.rb
 resource :favorites only: [:create, :destroy]

③favoriteモデルを追加

 $rails g model Favorite user_id:integer pet_id:integer
 $rails db:miigrate

今回私はuserテーブルとpetテーブルの中間テーブルとしてfavoriteテーブルを使用しています。

④リレーションを関連付ける

favorite.rb
    belongs_to :user
    belongs_to :pet
user.rb
     has_many :favorites, dependent: :destroy
pet.rb
has_many: favorites, dependent: :destroy


def favorited_by?(user)
 favorites.where(user_id: user.id).exists?
end

これで下準備は完成!

##いざ、非同期通信いいね実装
① いいね用の部分テンプレートを作成
view/favorites の中に _favorite.html.rebを作成する

_favorite.html.reb
<% if pet.favorited_by?(current_user) %>  
   <%= link_to pet_favorites_path(pet), method: :delete, remote: true do %>
       ♥<%= pet.favorites.count %>
   <% end %>
 
   <% else %>
      <%= link_to pet_favorites_path(pet), method: :post, remote: true do %>
         ♡<%= pet.favorites.count %>
      <% end %>
<% end %>

② 部分テンプレートを呼び出したいページに呼び出す

 <div class="favorite-btn<%= pet.id %>">
  <%= render 'favorites/favorite', pet: @pet %>
</div>

③ view/favorite の中に create.js.erb と destroy.js.erbを作成する

create.js.erb
$(".favorite-btn<%= @pet.id %>").html("<%= j (render 'favorite', pet: @pet) %>");
destroy.js.erb
$(".favorite-btn<%= @pet.id %>").html("<%= j (render 'favorite', pet: @pet) %>");

④ favorites_controller.rb を編集

favorites_controller.rb
 def create
    @pet = Pet.find(params[:pet_id])
    favorite = current_user.favorites.new(pet_id: @pet.id)
    favorite.save
  end

  def destroy
    @pet = Pet.find(params[:pet_id])
    favorite = current_user.favorites.find_by(pet_id: @pet.id)
    favorite.destroy
  end

これで完成!!

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?