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
此外,你应该使用:javascript
filter来呈现JavaScript,因为它会把它放在你的脚本标签,并允许缩进。
最后,你可以在haml的任何地方使用#{ruby_expression}
,包括:javascript
filter,当你需要将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和其他框架中,你可以使用一个辅助方法来做到这一点。 如果你看哈姆参考,他们实际上不鼓励使用-
评估红宝石。