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.rb
def 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.