ruby everywhere

Been doing some JavaScript apps recently in Rails and decided to push RJS as far as I could.

Along the way I found some things that are pretty nice to have on the client side to avoid having to code all your JavaScript in strings.

update_page

<%= link_to_function 'Yes' do |page|
      page[:one].hide
      page[:two].show
    end %>

Putting that in your views Generates the following JavaScript

<a href="#" onclick="$('one').hide();$('two').show();; return false;">Yes</a>

That page object that’s yield‘d to by #link_to_function is a JavaScriptGenerator object. The same kind you get when you do stuff like this on the serverside

def search
  respond_to do |wants|
    @users = User.search params[:q]
    wants.js
  end
end

search.rjs

page.update_html :results, render(:partial => 'user', :collection => @users)

There’s also #update_page_tag. This method also yield’s a JavaScriptGenerator object to the given block and then wraps the generated JavaScript in some 'script’ tags.

<%= update_page_tag do |page|
   page[:one].show
   page[:two].hide
  end %>

Generates the following JavaScript

<script type="text/javascript">
  $('one').show();
  $('two').hide();
</script>

One thing it doesn’t yet support but would be great if it did in Rails 2.0 is registering event handlers.

<%= update_page_tag do |page|
  page[:one].on_click do
    page[:two].show
  end
end %>

It would be really nice if that generated

<script type="text/javascript">
  Event.observe('one', 'click', function () {
                                  $('two').show();
                                });
</script>

Most of my existing client side JavaScript consists of registering event handlers, so I still have some JavaScript code in my views consisting of Ruby strings. With something like this, we could be close to eliminating JavaScript entirely; the same way Rails’ migrations have done with SQL.