テンプレート(js.erb)でAjax

Ruby on Railsを学習中で,アセットパイプラインのところだったので,Ajaxはどうやって実装するのかなと思ってやってみました.

調査してみると大きく2つの方法がありました.
ひとつはRailsらしい方法で,もうひとつは従来のAjaxに近い方法でした.今回のエントリは前者を取り上げ,後者は次回にまわします.

Versions

ruby: 2.2.1 rails: 4.2.1

テンプレート(js.erb)でAjax

以下に,コードをリストする.処理順をイメージしてのリストなので実装順にはならないかもです.

アンカーをクリックするとサーバから時間をもらう仕様です.

スクリーンショット 2015-10-08 午後8.09.54

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で採用されているのだから特に問題はないのだろうと思いますが.