ruby on rails でAjaxを使いcontrollerのメソッドを動かす

views/albums/_form.html.erb

<%= button_tag type: 'button', :id => 'get-near-albums' do %>
<%= 'Start Ajax' %>
<% end %>

javascript

$("#get-near-albums").click(function(){
    $.ajax({
        url: "get_near_albums",
        type: "GET",
    }).done(function(data){
        alert("success");
        console.log(data);
    }).fail(function(data){
        alert("errror");
        console.log(data);
    });
});

これでボタンがクリックされるとjavascriptで記述したajax処理が動く

controller/albums_controller.rb

def get_near_albums
  puts "get_near_albums"
  @albums = Album.all
  @albums.each do |album|
    puts album.title
  end
  render nothing: true #
end

memo

本来get_near_albums.html.erbという空のviewファイルを作成する必要があるが、render nothing: trueを記述しておくと必要なくなる。 ちなみに、viewに値を返したいときは以下のように記述(例としてjson)

render :json => @albums

routes.rb

get 'albums/get_near_albums'

resources :albumsを記述していたら、なぜかshow.html.erbに飛ばされた。 おそらく、:idの部分が"get_near_albums"と認識されていた。。。 面倒なのでshowは使わないことにして以下のようにrouteに記述

get 'albums/get_near_albums'
resources :albums, :except => [:show]

以上で、「Start Ajax」ボタンを押すと、コンソール画面にalbumのタイトル一覧が表示されるので、ajaxが成功していることがわかる

参考

http://qiita.com/somewhatgood@github/items/113773747a6faa800366 http://blog.toshimaru.net/jquery-ajaxdeferredajax/ http://railsdoc.com/references/render