我有一个jQuery脚本,它向表单添加一个新字段,该字段包含来自数组的动态信息。问题是我无法弄清楚如何添加一个array.each来填充javascript中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过滤器,没有运气。
答案 0 :(得分:101)
通常情况下,如果某些事情是haml的痛苦,那就意味着你应该将这个棘手的位重构为帮助者或部分并调用它。
// some_helper.rb
def new_snazzy_select_tag(options = [])
select_tag 'tag_name_here', options.map { |option| [option.id, option.name] }
end
此外,您应该使用:javascript
过滤器来呈现javascript,因为它会将它放在脚本标记中并允许缩进。
最后,您可以在haml中的任何位置使用#{ruby_expression}
,包括:javascript
过滤器,当您需要将ruby表达式的结果输出到不直接包含html元素内容的位置时,这非常方便。
// some_view.html.haml
:javascript
$('#mylink').click(function() {
$('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}");
};
答案 1 :(得分:8)
试试这个,它应该可行(我所做的就是删除第五行中的单个空格并在第六行添加结束语句):
%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和其他框架中,您可以使用辅助方法来执行此操作。如果你看一下haml引用,他们实际上不鼓励使用-
来评估ruby。