Ajaxによるボタン表示の切り替え
Ajaxを使えば、Webページからサーバーに非同期で、ページを移動することなくリクエストを送信することができる。
ビュー
remote: true
によってJavascriptによる変更が可能になる
<!-- フォローボタン --> <%= form_with(model: ..., remote: true) do |f| %> ... <%= f.submit "Follow" %> <% end %>
<!-- フォロー解除ボタン --> <%= form_with(model: ..., html: { method: :delete }, remote: true) do |f| %> ... <%= f.submit "UnFollow" %> <% end %>
コントローラ
respond_toでリクエストの種類によって応答を場合分けする。
class RelationshipsController < ApplicationController def create @user = User.find(params[:followed_id]) current_user.follow(@user) respond_to do |format| format.html { redirect_to @user } format.js # デフォルトの挙動 end end # destroyアクションも同様 end
JS-ERbファイル
Ajaxリクエストを受信した場合は、Railsが自動的にアクションと同じ名前を持つJavaScript用の埋め込みRuby(.js.erb)ファイル(create.js.erbやdestroy.js.erbなど)を呼び出す。
それらのファイルでDOMを操作するためのjQueryを書く。
// views/relationships/create.js.erb $("#follow_form").html("<%= escape_javascript(render('フォロー解除ボタンのパーシャル')) %>");
escape_javascriptメソッドによりJavaScriptファイル内にHTMLを挿入するときに実行結果をエスケープする