【问题标题】:haml/javascript/erb escapinghaml/javascript/erb 转义
【发布时间】:2011-06-27 09:30:08
【问题描述】:

我有一个奇怪的情况,但它是:

# a HAML file
:javascript
  #{ if session[:view].blank?
        "$.ajax({
            url: 'url_for params.merge(:action => 'index')',
            dataType: 'script'})"
    else
        "$.ajax({
            url: 'url_for companies_url',
            dataType: 'script'})"
    end }

所以这基本上是在 ruby​​、javascript、HAML 中嵌套 javascript。它不起作用,因为我的引号嵌套不正确。

  1. 我想有更好的方法来做到这一点。有什么想法吗?
  2. 上面发生的 ajax 将一些部分呈现到当前视图中并更改会话变量。如何更新此 javascript,使其在新会话 [:view] 的情况下正常运行?

【问题讨论】:

  • 这行不通? url: 'url_for params.merge(:action => \'index\')',

标签: javascript ruby-on-rails haml erb nested


【解决方案1】:

使用 ERB 和辅助方法。干净多了:

# foo_helper.rb (or whichever helper is applicable for this view)
module FooHelper
  def url_for_ajax_call
    if session[:view].blank?
      url_for(params.merge(:action => 'index'))
    else
      # url_for(companies_url) is redundant
      companies_url
    end
  end
end

# view.js.erb
$.ajax({ url: <%= url_for_ajax_call %>, dataType: 'script' })

【讨论】:

  • 这太棒了,它很好地解决了我的嵌套问题。你知道我该如何处理#2,即如何根据 ajax 响应重新评估这个 javascript/erb 吗?当然此时 session[:view] 已经被控制器改变了。
【解决方案2】:

在我看来,您不需要切换到 ERB,但辅助方法很好。我会将 URL 放入页面呈现的标签中。通常我在锚标记的 data-href 属性中为不显眼的 javascript 执行此操作。例如:

= link_to "Link to index view", url_for(params.merge(:action => "index")), { 'data-href' => url_for_ajax_call }

然后:

$.ajax({ url: $(element).data('href'), dataType: 'script' })

那么你需要做的就是重新渲染link_to,它将重新生成正确的url_for_ajax_call。

显然,这种方式需要做更多的工作,因为您需要在链接中添加click event handler,并且您需要停止实际点击链接 (http://api.jquery.com/event.preventDefault/)。但是没有必要为单个文件切换到ERB,您可以处理关闭javascript的用户,它会解决您的第二个问题。

【讨论】:

    【解决方案3】:

    我能找到用haml 做这类事情的最佳方法是将javascript 写为%script bloc 中的文本。所以你的代码会变成:

    # a HAML file
    %script
      -if session[:view].blank?
        $.ajax({url: 'url_for params.merge(:action => 'index')',dataType: 'script'})
          -else
        $.ajax({url: 'url_for companies_url', dataType: 'script'})
    

    作为奖励,您现在甚至可以进行 ruby​​ 插值:

    # a HAML file
    %script
      alert("#{ruby_variable}")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多