如何使用 haml 将内插的 ruby 对象正确格式化为 rails 中的 jquery 选择器?

How do I properly format interpolated ruby objects as jquery selectors in rails, using haml?

<% if @discussion_category %>
 $("#<%= dom_id(@discussion_category) %>_notice").html('');
 $("#<%= dom_id(@discussion_category) %>").html("<%=escape_javascript(render(partial: 'display_change', locals: {discussion_category: @discussion_category}))%>");
 $('#discussion_category_links').show();
<% end %>

我做了以下操作,但我做错了:

-if @discussion_category
  javascript:
    $(escape_javascript(#{dom_id(@discussion_category)} + '_notice').html('');
    $(escape_javascript(#{dom_id(@discussion_category)}).html(#{escape_javascript(render(partial: 'display_change', locals: {discussion_category: @discussion_category}))});
    $('#discussion_category_links').show();

我做错了什么?

escape_javascript函数在rails这边。您不希望它出现在输出中,所以它会在 #{}.

范围内

而且你扔掉了大部分引语。仍然需要那些。

希望没有错别字,但直接翻译应该更像这样:

-if @discussion_category
  javascript:
    $("#{escape_javascript(dom_id(@discussion_category))}_notice").html('');
    $("#{escape_javascript(dom_id(@discussion_category))}")
      .html("#{escape_javascript(render(partial: 'display_change', locals: {discussion_category: @discussion_category}))}");
    $('#discussion_category_links').show();

当像这样构建混乱的 RJS 东西时,使用 escape_javascriptj 别名会更简洁,这也有助于缩小语法问题的范围:

javascript:
  $("#{j dom_id(@discussion_category)}_notice").html('');
  $("#{j dom_id(@discussion_category)}")
    .html("#{j render(partial: 'display_change', locals: {discussion_category: @discussion_category})}");

最后,可能没有理由转义 dom_id 的输出,这意味着您可以:

javascript:
  $("#{dom_id @discussion_category}_notice").html('');
  $("#{dom_id @discussion_category}")
    .html("#{j render(partial: 'display_change', locals: {discussion_category: @discussion_category})}");

...开始看起来更具可读性。