Previously, in rails 2.3.8 i used the prototype-helpers link_to_remote
and form_remote_for
(amongst others).
These had the option :update
as follows:
link_to_remote "Add to cart",
:url => { :action => "add", :id => product.id },
:update => { :success => "cart", :failure => "error" }
(an example from the documentation). This example would, upon success update the html-element with class "cart", and upon failure the class "error".
Now i believe the modus operandi has changed, instead we write:
link_to "Add to cart", :url => {:action => "add", :id => product.id},
:remote => true
and there is no option to set :update
anymore.
Instead of a normal html, we now render javascript, like this (in jquery) :
$('.cart').replaceWith(<%= escape_javascript(render :partial => 'cart') %>)
but how do you handle an error situation? Do i handle it in my controller, and use seperate views?
It would seem useful to me to somehow be able to mimic the behaviour we had before. Any ideas?
Ha! I found it described in this article. In rails.js the following callbacks are checked:
As the javascript should be unobtrusive, this coupling is not done in the HTML.
An example (from the same site) : the following Rails 2.3.8
is translated to this :
and inside some javascript (application.js), you bind the events
Great! :)
[UPDATE: 29/12/2011]
Two events have been renamed lately:
ajax:beforeSend
: replace the lateajax:loading
ajax:error
replaces theajax:failure
(I guess to be more in line with jQuery itself)So my example would become:
For completeness, the events and their expected parameters:
I know this question is 3 years old, but it comes up high in Google results and some of the events listed above are not used anymore.
See here for a current list - https://github.com/rails/jquery-ujs/wiki/ajax
The related rails 4 guide can be found at: http://guides.rubyonrails.org/working_with_javascript_in_rails.html
It points to the documentation of the events at: https://github.com/rails/jquery-ujs/wiki/ajax , as mentioned by ncherro
The actual values passed to the callbacks can be inferred from jQuery's
ajax
method http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings.bind
is deprecated in favor of.on
by jQuery: http://api.jquery.com/on/So now the recommended approach is:
Template:
CoffeScript: