If you're a kind of a pragmatic developer, you're probably asking yourself "why would I fall in love with this new thing? I already know Prototype and jQuery why would I need something else?", and believe me, I know precisely what you mean.
But ask yourself, being a Rails developer, were you ever happy of doing AJAX features in Rails? No, I mean, not like first two weeks on rails, or things like "it's working". I mean really happy, did you feel funny about Prototype or jQuery? Did they make the butterflies in your stomach fly? Literally.
Think about it. The Prototype support on Rails was always a kind of a flimsy hack and most serious developers don't really use those RJS stuff. And with jQuery you were always left alone to deal with all those kinky JavaScript stuff. That's good if you are a JavaScript guru and know your magic. But what if you are not, and what about the actual Rails business anyway? Did any of the frameworks really helped you in any way to be an actual Ruby/Rails developer?
How Is RightJS Different?
First and most important thing you should know about RightJS is that it was written by a Ruby/Rails developer for Ruby/Rails developers. And despite the fact that from time to time we have all those arrogant promotions and we mock jQuery folks constantly. RightJS is not really about JavaScript itself. It is something quite opposite.
RightJS is all about getting JavaScript off your hair. RightJS is made to help Ruby developers to deal with JavaScript tasks, it reflects Ruby way of handling things, has mostly Ruby syntax and many of its key features are copies of Rails features.
RightJS civilizes JavaScript and brings it closer to Ruby developers.
But we didn't came here to talk about JavaScript, right? What about Rails itself?
Lets Make The Butter Fly
How much time does it take to make a date-time field with a calendar in your framework?
Let me spare you the calculations time and show how it looks like in RightJS + RightRails.
<% form_for(@zing) do |f| %>
<%= f.calendar_field :dead_line %>
<% end %>
Nope. I didn't forget nothing. `calendar_field` is all what it takes. RightRails automatically includes all necessary JavaScript, CSS and I18n modules on your page and initializes the fields, so you don't need to worry about a thing.
More of that, it will automatically swap between builds and source code for JavaScript in production and development modes.
So, would you like some rater or slider on your form?
<%= f.rater_field :rating %>
<%= f.slider_field :completeness %>
Oh, I know! You'd like some autocompleter, right?
<%= f.autocomplete_field :category, :url => categories_path %>
Would you like the autocompleter to be RESTful design and hard-caching friendly? No problem!
<%= f.autocomplete_field :category, :url => "/categories/%{search}.js" %>
Here you go.
And That's Not All
The fun is not over, not by a long shot. The next feature is that RightRails comes with a brand new RJS generator, and that's not just a collection of dummy functions like in the case of the Rails original RJS templates.
The new generator lets you literally write JavaScript in Ruby and more of that it allows you to mix Ruby and JavaScript calls in one flow escaping and transforming variables on fly.
For example this is how the annoying nested forms look like when you make them with RightRails.
<% form_for(@zing) do |f| >
<div id="categories">
<%= render @zing.categories %>
</div>
<%= link_to_function 'add' {|page|
page[:categories].insert(render(Category.new))
} %>
<% end %>
See, the `insert` method is a JavaScript function, the `render` is the ActiveView method, `Category` is your model. All in one flow with automatic types conversion. And it is not just a list of predefined functions, you can literally do whatever you want.
update_page do |page|
page[:todos].update render(@todos)
page[:todos_count].innerHTML = @todos.size + ' Items'
page[:todos].select('li').each do |item|
item.onClick('toggleClass', 'marked')
end
page.json_variable = @todos.to_json
page.items_count = @todos.size
page.list_updated = true
page.alert "There are #{@todos.size} items left on the list"
end
There are no limiatations.
Mommy Look, More Fancy Stuff!
Oh yes mommy, there are! On top of all RightRails has a conventional interface to cover the most common AJAX CRUD operations. Let me show you.
Say here's your remote form
<% remote_form_for(@zing) do |f| %>
<%= f.text_field :name %>
<%= f.file_field :picture %>
<%= f.submit 'Create' %>
<%= image_tag 'spinner.gif', :class => :spinner %>
<% end %>
And here is your controller method
dev create
@zing = Zing.new(params[:zing])
if @zing.save
render rjs.insert(@zing)
else
render rjs.replace_form_for(@zing)
end
end
The `rjs` method provides access to the new RJS generator from the controllers, and `insert` and `replace_form_for` are the AJAX operations interface.
It all works over the Rails conventions, the `insert` method looks for the class of the `@zing` model, finds related partial, renders it and generates a piece of JavaScript that inserts the HTML into an element with the `zings` ID.
The `replace_form_for` method will render a new form with all the error messages for the @zing model and generate JavaScript that will update the form on the page.
RightRails has a collection of such methods for all CRUD operations.
Note also that I've put a file field and a spinner image on the form. RightRails automatically and transparently processes files uploading too, basically there is no difference whether your form has files or not, it all has the same API. And the RightJS when submits a form via AJAX, automatically searches for images with the `spinner` class and uses them as spinners, you don't need to hook them up with callbacks manually.
Summary
I'm not going to indulge you with obvious conclusions, I'll just tell you that I've already used RightJS + RightRails on two production projects and it saved me hell of a lot of time and nerves on JavaScript and AJAX development.
Well, it was designed to.