HAML中Javascript中的Ruby方法

Jos*_*osh 57 javascript ruby jquery 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>);  
  )};
Run Code Online (Sandbox Code Playgroud)

还尝试使用:javascript过滤器,没有运气.

Ale*_*yne 103

通常情况下,如果某些东西是haml的痛苦,那就意味着你应该将棘手的位重构为助手或部分并调用它.

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

此外,您应该使用:javascript过滤器来呈现javascript,因为它会将它放在脚本标记中并允许缩进.

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

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

  • TL; DR ...?使用#{ruby_expression}谢谢Alex. (6认同)
  • 助手通常位于视图和控制器之间.它们永远不应该改变任何服务器端状态,只是在那里用恶劣的视图逻辑帮助*.您的视图中的Ruby应该尽可能小,以便清晰和可维护.助手帮忙解决这个问题. (4认同)

ehs*_*nul 8

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

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

但是,假设您使用ruby脚本或类型框架运行此操作,为什么不在模板外部执行此操作?这可能是最合适的.在rails/sinatra和其他框架中,您可以使用辅助方法来执行此操作.如果你看一下haml参考,他们实际上不鼓励使用它-来评估ruby.