HAML中的JavaScript内的Ruby方法

我有一个jQuery脚本,将一个新的字段添加到窗体,并且这个字段包含一个数组的dynamic信息。 问题是,我不知道如何添加一个array.each来填充select字段的选项,而不会打破HAML缩进并导致错误。

这是我最好的尝试,不起作用:

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

也尝试过与:JavaScript的filter没有运气。

通常情况下,如果haml中有什么是痛苦的,那就意味着你应该把这个棘手的位重构成一个helper或者partial,然后调用它。

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

此外,你应该使用:javascriptfilter来呈现JavaScript,因为它会把它放在你的脚本标签,并允许缩进。

最后,你可以在haml的任何地方使用#{ruby_expression} ,包括:javascriptfilter,当你需要将rubyexpression式的结果输出到不是html元素的直接内容的地方时,这非常方便。

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

尝试这个,它应该工作(我所做的只是删除第五行中的一个空格,并添加结束报价第六):

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

不过,假设你使用ruby脚本或者类似的框架来运行它,为什么不在模板之外进行呢? 这可能是最合适的。 在rails / sinatra和其他框架中,你可以使用一个辅助方法来做到这一点。 如果你看哈姆参考,他们实际上不鼓励使用-评估红宝​​石。