yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY183>いいねの非同期化

\ Follow me!! /

●8/23(金)
●学習日数 183日
●学習時間(本日)8時間
●累計学習時間 801.0時間
●一日あたりの平均学習時間 4.37時間

結論(ポイント)

(1)remote tureを指定するだけでajaxで通信する事ができる
(2)jsファイル記述の際にrenderを指定するのでajaxで変更したい部分だけテンプレート化しておく
(3)respond to |format|にてjs処理かhtml処理を指定する

https://i.gyazo.com/1e3778bcf5173c08ea03ff5ff7ea47c2.gif


手順1

ajaxで表示を変更させたい箇所を部分テンプレート化させる
今回だと、数字の部分のみを変更させる。
_like.html.hamlファイルを作成した。
id:"like_judgment"を付与させてセレクタをつける必要がある。
remote: trueを忘れない。


app/view/likes/_like.html.haml

- if Like.find_by(user_id:current_user&.id,tweet_id: @tweet.id)
  = link_to @tweet.likes.count,"/likes/#{@tweet.id}/delete",method: :delete, remote: true,id:"like_judgment"
- else 
  =link_to @tweet.likes.count,"/likes/#{@tweet.id}/create",method: :post, remote: true,id:"like_judgment"

手順2

js.erbファイルの作成。
ajax通信時にjs.erbファイルに飛ばすため必要な記載。
コントローラのアクションと命名を合わせる。


app/view/likes/create.js.erb
app/view/likes/destroy.js.erb
同じ記載を実施する。

$('#like_judgment').html("<%= j (render partial:'likes/like') %>");
$('#like_judgment').slideDown(350);

手順3

既存の記載に以下を加えただけである。
対象のcreataとdestroyに加える。
respond_to do |format|
format.html
format.js
end


コントローラの記載を変更

app/controller/likescontroller

 def create
    respond_to do |format|
        like = Like.new(user_id:current_user&.id,tweet_id: @tweet.id)
        like.save
        format.html{redirect_to tweet_path(@tweet.id) }
        format.js
    end
   
   
  end

  def destroy
    respond_to do |format|
      like = Like.find_by(user_id:current_user&.id,tweet_id:@tweet.id)
      like.destroy
      format.html{redirect_to tweet_path(@tweet.id) }
      format.js
    end
  end

以上で非同期は完了。