JSONでAjax

Versions

ruby: 2.2.1 rails: 4.2.1

JSONAjax

前回エントリはテンプレートでAjaxでした. 今回はRailsではないアプリでお馴染みの方法に近い方法をエントリします.

アンカーをクリックすると,コントローラで作成したJSONを表示します.

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

config/routes.rb

  ############################
  # ajaxjson (ajax with json)
  ############################
  get "ajaxjson(/:action)" => "ajaxjson"

app/views/ajaxjson/index.html.erb

<% @page_title %>
<h1><%= @page_title %></h1>

<%= link_to("ajaxjson_list", {action: :list}, id: "ajaxjson_list", remote: true) %>

<div id="ajaxjson_list_result"></div>

link_toにidを設定します.これをAjaxのレシーバとするということです(当たり前ですが.

app/controllers/ajaxjson_controller.rb

class AjaxjsonController < ApplicationController

  def index
  end

  def list
    result = []
    5.times do |i|
      result.push({name: "book_#{i + 1}", author: "author_#{i + 1}"})
    end
    render json: result
  end

end

Ajaxはlistアクションが処理します. リターンするJSONオブジェクト(result)を作成しています. render json: result とします. 対応するviewsの erb や js.erb はありません.

assets/javascripts/ajaxjson.js

$(function() {
  // Receiver
  $("#ajaxjson_list")

    .on("ajax:success", function(evt, data, status, xhr) {
      $result = $("#ajaxjson_list_result");
      $result.empty();
      $br = $("<br>");
      data.forEach(function(e) {
        $p = $("<p>").append(`name: ${e.name}, author: ${e.author}`);
        $result.append($p).append($br);
      });
    })
    
    .on("ajax:error", function(evt, xhr, status, error) {
      console.log("Error: " + error);
    })
});

イベント名の"ajax:success", "ajax:error", "ajax:complete"等は,jquery-railsで定義されているようです.

まとめ

良いところとして感じたのは,やはり従来どおりのAjax通信のイメージに近いところです.

良くないところとして感じたのは,JavaScriptが大きくなるところと,アセットパイプラインがつらいところです. アセットパイプラインは,assets/javascriptsフォルダ内にJSファイルを置くのですが,Viewに対するJSが管理できない(すべてのJSをロードするらしい...)のがつらいです(やる方法はあるようですが...)

結論的な・・・

Railsに乗るにはテンプレートを活用するようにした方がよいようです. アセットパイプラインにはユーティリティ関数を乗せる感じでしょうか.