Ruby methods within Javascript within HAML Ruby methods within Javascript within HAML javascript javascript

Ruby methods within Javascript within HAML


Usually, if something is a pain in haml, it means you should refactor the the tricky bit to a helper or partial and call that.

// some_helper.rbdef new_snazzy_select_tag(options = [])  select_tag 'tag_name_here', options.map { |option| [option.id, option.name] }end

Also, you should use the :javascript filter to render javascript since it will put it in a script tag for you and allow indentation.

Lastly, you can use #{ruby_expression} anywhere in haml, including :javascript filters, which is very handy when you need to output the result of ruby expressions to places that are not directly contents of html elements.

// some_view.html.haml:javascript  $('#mylink').click(function() {      $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}");  };


Try this, it should work (all i did was remove a single space in the fifth line and add the closing quote on the sixth):

%script(type="text/javascript")  $('#mylink').click(function() {  $('#mylink').after('<select>  - @myarray.each do |options|    <option value="#{options.id}">#{options.name}</option>  </select>');  )};

However, assuming you're running this with a ruby script or framework of sorts, why not just do it outside the template? That would probably be most appropriate. In rails/sinatra and other frameworks, you could use a helper method to do this. If you look at the haml reference, they actually discourage use of - to evaluate ruby.