Unobtrusive Javascript in Rails

Hi everybody,

I love using rails, but one of my major problems with it has always
been how the helper methods create some really ugly inline javascript.

I’ve recently found jQuery after watching Ryans brilliant Railscast
about it (#136 jQuery - RailsCasts).

I think that jQuery is a great way to make Rails unobtrusive and it
has a really easy to pick up syntax.

The main problem is though that you can’t use any of those nice helper
methods anymore!

Is anybody interested in helping me to get a project going to try and
set some best practice, code snippets to do common tasks or even
jQuery or Rails plugins that would help make unobtrusive JS just as
easy as the default JS in Rails? If anybody has already done any of
this then please let me know. Here is a wishlist to get started:

  • Find an unobtrusive way of deleting things in a RESTful way
  • Faking the PUT and DELETE verbs unobtrusively
  • Adding an authenticity token to forms unobtrusively (the form_for
    helper adds a bit of inline javascript)
  • Which jQuery plugins are essential? Should they all be packaged up
    as a Rails plugin that would work similar to <%
    javascript_include_tag :defaults %>
  • Easy drag and drop that plays nicely with the controller
  • Sortable lists and sortable nested lists
  • Inline editing
  • Are there any settings that are needed (such as when Ryan sets this
    up in the railscast)
    ‘beforeSend’: function(xhr) {xhr.setRequestHeader(“Accept”, “text/
    or the fact that you need something like the following before you can
    use Ajax with authenticity tokens:
    <%= javascript_tag “window._token = ‘#{form_authenticity_token}’” if
    protect_against_forgery? %>

Hope this gets some discussion going … I don’t intend for this to
become a discussion about whether or not UJS is worth it or not. If
you are happy with the current inline stuff then please continue to
use it, but I know that a lot of people want UJS and this is an
attempt to make it as easy as possible for them to do that.

Looking forward to any thoughts…