テンプレート(js.erb)でAjax
Ruby on Railsを学習中で,アセットパイプラインのところだったので,Ajaxはどうやって実装するのかなと思ってやってみました.
調査してみると大きく2つの方法がありました.
ひとつはRailsらしい方法で,もうひとつは従来のAjaxに近い方法でした.今回のエントリは前者を取り上げ,後者は次回にまわします.
Versions
ruby: 2.2.1 rails: 4.2.1
テンプレート(js.erb)でAjax
以下に,コードをリストする.処理順をイメージしてのリストなので実装順にはならないかもです.
アンカーをクリックするとサーバから時間をもらう仕様です.
config/routes.rb
############################
# time (ajax with js.erb)
############################
get "time(/:action)" => "time"
app/views/time/index.html.erb
<% @page_title = "Time" %>
<%= @page_title %>
<%= link_to("Now", {action: :now}, remote: true) %>
link_toのパラメータとして以下を付けます.
- action: :now => time_controllerのnowアクションを呼びます.
- remote: true => Ajax対応の場合付けます.
app/controllers/time_controller.rb
class TimeController < ApplicationController
def index
end
def now
@time = DateTime.now.strftime("%Y/%m/%d %H:%M:%S")
@time = "time is #{@time}"
puts @time
end
end
インスタンス変数にテンプレートに渡したい値をセットします.
app/views/time/now.js.erb
$("#time").html("<%= escape_javascript(@time) %>;");
通常のテンプレートと同様に,アクション名と同じ名前をファイル名につけます.
erbなのでRubyのコードが書けます.Rubyコード以外は普通のJavaScriptです.jQueryは特に設定もせずデフォルトで利用できます.
まとめ
良いところとして感じたのは,テンプレートで管理できる分,部品化(コンポーネント化)できることです.
悪い点?として感じたのは,毎回JavaScriptを送りつける(?)のはどうなのかなあと思ったことです.Railsで採用されているのだから特に問題はないのだろうと思いますが.