これまでに作った機能について簡単にまとめていく。
今回は、
いいね機能をAjax化する
前提条件
いいね機能があること
まだの方はこちら
使用モデル
Userモデル
| カラム | データ型 | |
|---|---|---|
| 1 | name | string |
| 2 | text | |
| 3 | password_digest | string |
Blogモデル
| カラム | データ型 | |
|---|---|---|
| 1 | title | string |
| 2 | content | text |
Likeモデル(中間テーブル)
| カラム | データ型 | |
|---|---|---|
| 1 | user_id | bigint |
| 2 | blog_id | bigint |
いいね機能のビューをパーシャル化
app/views/blogs/_form.html.erb
<% unless @blog.user_id == current_user.id %>
<% if @like.present? %>
<%= link_to 'いいねを取り消す', like_path(id: like.id), method: :delete", remote: true %>
<% else %>
<%= link_to 'いいね', likes_path(blog_id: blog.id), method: :post", remote: true %>
<% end %>
<% end %>
インスタンス変数の直接受け取りから変数の受け取りに変更
remote: trueでjsのリクエストに変更
パーシャルの呼び出し
app/views/blogs/show.html.erb
<%= render partial: ‘likes/like’, locals: { like: @like, blog: @blog } %>
フォーマットの指定
app/controllers/likes_controller.rb
class LikesController < ApplicationController
def create
like = current_user.likes.create(blog_id: params[:blog_id])
respond_to do |format|
format.js { render :like }
end
end
def destroy
like = current_user.likes.find_by(id: params[:id]).destroy
respond_to do |format|
format.js { render :like }
end
end
end
JavaScriptの処理を作成
app/likes/like.js.erb
$("#like_area").html("<%= j(render 'likes/like', { like: @like, blog: @blog, user_id: current_user.id }) %>")
以上で作成完了
