railsでエイジャックス
Rails 4.0.0.beta1
$().jquery # => "1.9.1"
膨大なアイテムの中から、絞り込みをかけてからひとつづつアイテムを追加したり削除したりしようとすると、
controllerが太ると思ったのでしぶしぶajaxを使った時のメモ。
ここでは、非同期リクエストを投げて、通信成功した時に発火するところまでをざっくり書く。
ajaxする時に編集する必要があるファイル
テンプレート
link_toとかのremoteオプションをtrueにする。
そうすることで非同期リクエストが投げられる。
controller
レスポンスをjsonにするように指定する。
js
通信成功した時の動きを書く。
テンプレート
<%= link_to "追加する", add_admin_path(book), remote: true, :class => "ajax_link" %>
テンプレートに関しては、remoteオプションをtrueにするだけでよい。
controller
class Admin::booksController < Admin::BaseController def show book = Book.new(params[:id]) render json: book end end
レスポンスにjsonを指定すればなぜかjsで指定したコールバックが発火する。
js
application.js
$(function(){ $('a.ajax_link').on('ajax:complete', function(data, ajax, xhr){ response = $.parseJSON(ajax.responseText) console.log(response.book) }); });
complete
は通信が終わった時に発火するコードバック。失敗しても動作する。
(successは、通信が成功した時に発火するのでステータスコードは引数では受け取らない。)
response = $.parseJSON(ajax.responseText)
は文字列できたjson形式のレスポンスをjsonに変換しているらしい。
console.log(response.book)
console.logを使って、デバッグしているとオブジェクトを参照できるのですごく便利。
alertだと[Object object]みたいな情報しか得られなくてやばい。
jsのコールバックが起動しない原因・現象
- レスポンスにhtmlを返している
- ブラウザの開発ツールを使えばレスポンスが見ればわかる。
- "uncaught syntaxerror unexpected token u"と出る
- コールバックと引数が一致していない。succcesssなのにcomplateで使う引数を使っているとか変数名が間違っている。
- console.logが使えない
- IEは非対応
- CSSセレクタが誤っている
- idを指定するとか少し変えてみれば
- レスポンスが返ってきたけどプロパティがundifinedになる
- console.logを使ってjsonの見てみる
参考記事
http://www.koikikukan.com/archives/2012/10/02-005555.php
http://etu.bituse.info/js/13
http://blog.livedoor.jp/sasata299/archives/51841211.html
http://tohae.hatenablog.com/entry/20101019/1287484896