その他
    ホーム 技術発信 DoRuby jQuery.ajaxでRailsのコントローラを叩く
    jQuery.ajaxでRailsのコントローラを叩く
     

    jQuery.ajaxでRailsのコントローラを叩く

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    ajaxを利用することで、jQuery側からRailsのコントローラへアクセス出来たので備忘録を兼ねて記載しようと思います。

    gemの導入

    railsでjQueryを扱えるように、gemを導入します。

    (デフォルトで入ってる場合もあるみたいです。)

    # Gemfile
    gem 'jquery-rails'
    

    Controllerの用意

    # tests_controller.rb
    
    def index
    end
    
    #ユーザの一覧をjson形式で返すアクション
    def ajax_test
      @user = User.all
      render json: @user
    end
    

    ページ表示用のindexアクションと、ajax通信用のajax_testアクションを定義したControllerを用意します。

    対応するルーティングの追加

    ajaxでアクセス出来るように、ルーティングを追加します。

    # config/routes.rb
    Rails.application.routes.draw do
      resources :users
      resources :tests
      get 'ajax_test', to: 'tests#ajax_test'
    end
    

    Viewの用意

    # index.html.erb
    
    <% content_for :head do %>
      <%= javascript_include_tag 'ajax_test', 'data-turbolinks-track' => true %>
    <% end %>
    
    <h1>ajaxテストページ</h1>
    
    <%= link_to 'jsonを表示する', ajax_test_path, {id: "ajax_test", remote: true} %>
    
    <table id="user"></table>
    

    indexアクションでrenderするviewファイルを用意します。

    今回は、リンクをクリックしたらajax通信が始まるようにしました。

    (remote: trueを追加することで、rails側がajax通信をしてくれるようになります。)

    coffeescriptの用意

    ajaxでアクセスするためのcoffeescriptを用意します。

    リンクをクリックしたら、動作するように指定しました。

    また、ajax通信が成功したら、返却されたjson形式のデータをtableタグの内部に追加するようにしています。

    # ajax_test.js.coffee
    
    $ ->
      $("#ajax_test").click ->
        $.ajax
          url: '/ajax_test'
          type: 'get'  #get,postの指定
          dataType: 'json' #レスポンスのデータタイプ指定
          async: true #非同期通信フラグ
        .done (response) ->
          #処理が成功した時の処理
          $("#user").append("<tr><th>名前</th><th>年齢</th></tr>")
          for i in [0..response.length]
            $("#user").append("<tr><td>" + response[i].name + "</td><td>" + response[i].age + "</td></tr>")
        .fail (response) ->
          #処理が失敗した時の処理
          alert 'fail'
    
    # 生成されるjavascript
    
    (function() {
      $(function() {
        return $("#ajax_test").click(function() {
          return $.ajax({
            url: '/ajax_test',
            type: 'get',
            dataType: 'json',
            async: true
          }).done(function(response) {
            var i, j, ref, results;
            $("#user").append("<tr><th>名前</th><th>年齢</th></tr>");
            results = [];
            for (i = j = 0, ref = response.length; 0 <= ref ? j <= ref : j >= ref; i = 0 <= ref ? ++j : --j) {
              results.push($("#user").append("<tr><td>" + response[i].name + "</td><td>" + response[i].age + "</td></tr>"));
            }
            return results;
          }).fail(function(response) {
            return alert('fail');
          });
        });
      });
    
    }).call(this);
    
    

    実際に動作させてみる

    railsを起動して、期待通りに動作するか確かめました。

    enter image description here
    enter image description here
    上記の「jsonを表示する」リンクをクリックすることで、無事テーブル内にjsonの中身を表示することが出来ました。

    まとめ

    jquery側からControllerへ、ajaxを利用すればアクセス出来ることが分かりました。

    まだ単純なアクセスと表示でしか利用出来ていないので、もっと他に便利なことが出来ないか模索してみたいと思います。

    記事を共有