I have created a Rails3 application, started with Haml/Sass and finding it awesome. I am also trying to do unobtrusive javascript.

Before, in Rails 2.3, I would have expected a remote-form to have an :update attribute, where you could specify a selector where the response of the remote method would be rendered.

Now it needs to be done differently: my controller function will render a “.js” view, which will do the necessary actions itself. This makes it more library agnostic, and i prefer jquery.

So for instance i have a controller action “search”, and i have a corresponding “search.js.erb” as follows:

$('.grid').replaceWith('<%= escape_javascript(render :partial => 'list') %>')

This works. It will replace the html of the element with a class grid with the html from my rendered partial.

I started out trying to achieve that in HAML, and failed at first. So first i created the above ERB code which worked. Now my task seemed simpler: translate this seemingly simple line to HAML.

My first naive approach was to do the following:

= "$('.grid').replaceWith('#{escape_javascript(render :partial => 'list')}')"

But this just places the html as a readable string inside my page. Even i do something simple like

= "$('.grid').replaceWith('<h3>Text</h3>')

i see the actual characters


and not the markup. But i need to contain the javascript inside the double-quotes or haml will not recognise it, and can not interpolate my ruby there.

After looking through the HAML reference, actually the solution was incredible simple. Once more.

!= "$('.grid').replaceWith('#{escape_javascript(render :partial => 'list')}')"

The != unescapes HTML (as opposed to the standard =). This is exactly what we need of course.