HAML中Javascript中的Ruby方法

时间:2010-04-14 20:38:56

标签: javascript jquery ruby haml

我有一个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过滤器,没有运气。

2 个答案:

答案 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。