railsでajax
ついにrailsを始めました。
初心者には敷居が高いとそこかしこで言われてるのを聞きましたが、やり始めて確かにこりゃ敷居高い気がするなぁと納得しておるところです。railsの理念の一つである「設定より規約」の「規約」の部分が膨大なところが敷居の高さの原因なんじゃないかと思ったり。イマイチそこらへんが自分の中でもまとまってないので手こずっています。
実行の度にコントローラなりモデルなりシンボルなりに三単元のsが足りないとか単数形じゃないとか、どこぞの公立中学の英語教師みたいに嫌味のようなエラーをネチネチと吐かれ、ストレスを貯めこむ日々です。
とかまぁなんとかで昔の嫌な思い出を掘り返しつつもrailsでajaxで通信する方法を学んだので、覚書。
環境はrails3.2.3, ruby1.9.3, on ubuntu12.04
view側に必要なコード
<%= link_to "get data!!", get_data_path(data_id: 1), remote: true %>
こんだけ。form_forとかlink_toとかで他のオプションみたいに『remote: true』を指定してやればいい。
controller側に必要なコード
def get_data @data = Data.where(:data_id => params[:data_id]) if @data.present? status = "success" else status = "error" end render json: {status: status, data: @data} end
こっちも重要なのはrender jsonのところくらい。
javascriptに必要なコード
ここが一番面倒だったかも。
jquery-ujsをサラッと見たところ、delegateとか出てきていた。
ので、remote:true を指定した link_to とか form_form で生成された要素を含む要素にajax:completeとかの独自イベントがバインドされている。
独自イベントは
の4種。
どれも使い方はhttp://api.jquery.com/jQuery.ajax/にあるコロン以降同名のコールバックオプションと変わらないので、バリデーションとか成功時失敗時にやりたいことを書いておけばいい。
$("#hoge_id") .live("ajax:beforeSend", function(){ alert("loading"); }) .live("ajax:success", function(){ alert("success"); }) .live("ajax:error", function(){ alert("error"); }) .live("ajax:complete", function(){ alert("complete"); });