学習記録

アウトプット用に作りました

Ajaxを実装する

Ajaxとは

Webブラウザ上で非同期通信を行い、ページの再読み込みなしに
ページを更新するためのJavaScriptのプログラミング手法です。

Ajaxを使うことで、スムーズな操作を行うことができます。
いいね機能を実装するときを例に説明します。

Ajaxを使わない場合

①いいねボタンをクリック
②HTMLリクエストが送信される
③コントローラ内のcreateアクション
④dbに保存

Ajaxを使う場合

①いいねボタンをクリック
②JSリクエストが送信される
③コントローラ内のcreateアクション
④create.js.erbを探し、同時にdbに保存


railsAjaxを使う

form_with

デフォルトでAjaxをフォームで使えます。
もしこの設定を変更したい時は、:localオプションを使います。

<%= form_with(model: @article) do |f| %>

上のコードから以下のHTMLが生成されます。

<form action="/articles" accept-charset="UTF-8" method="post" data-remote="true">

data-remote="true"により、
フォームの送信がAjaxによって送信されるようになります。

link_to

このメソッドには:remoteオプションがあり、
このオプションを設定することで、
Ajaxを使用することができるようになります。

<%= link_to "記事", @article, remote: true %>

上記のコードによって、以下が生成されます。

<a href="/articles/1" data-remote="true">記事</a>

button_to

このメソッドもlink_toと同じようにremote:オプションをつけて
Ajaxを使用することができます。


remote: trueを指定することによって、
レンダリング処理をhtmlではなくjsファイルで実行されます。
なので、コントローラの該当アクションと結びつく.js.erbファイルを実装します。

jsファイル
$("#id名").html("<%= j(render 'likes/like') %>");

上記で使ったhtmlメソッドは、指定した要素("id名")の内容を置き換えています。
指定したid自体は変わりません。
htmlメソッド以外にもreplaceWithメソッドというのもあります。
このメソッドは、指定した要素そのものの内容を置き換えます。
なので指定したid自体を変えてしまします。(上書きのイメージ)

またj(renderは、escape_javascript(renderのエイリアス(別名)です。
パーシャルのレンダリング結果をJavaScriptの文字列として受け取るために必要です。
railsで使う特殊な文字をエスケープさせています。