【问题标题】:How do I Inject a JavaScript variable into Ruby code using HAML?如何使用 HAML 将 JavaScript 变量注入 Ruby 代码?
【发布时间】:2013-06-27 05:18:20
【问题描述】:

我正在尝试将 filename JavaScript 变量注入到我的 Ruby 代码中,如下所示:

"#{ajax_download_report_url(" + filename+ ")}"

这是一个基本的路由 URL,但我需要在 HAML 中传递这个变量,因为我从这个 Ajax 请求中得到它:

:javascript
        var updaterId = setInterval(function() {
          $.ajax({
            url: #{admin_reports_url.to_json},
            dataType: "json",
            type:  "GET",
            data: {job_id: "#{job_id}"},
            success: function(response){
              var filename = response.file;
              switch(status) {
                case 'failed':
                  $('.loader').hide();
                  clearInterval(updaterId);
                  alert(message);
                  break;
                case 'completed':
                  $('.loader').hide();
                  clearInterval(updaterId);
                  location.href = "#{ajax_download_report_admin_reports_url(" + filename+ ")}";
                  break;
              }
            }
          })}, 1000);

现在我有一个错误:

ActionController::RoutingError - No route matches 
{:controller=>"admin/reports", :action=>"ajax_download_report", :file=>" + filename+ "}

这意味着 HAML 无法正确评估此代码。

【问题讨论】:

  • 您似乎没有尝试将 JavaScript 变量注入 Ruby 代码,但这是行不通的。相反,您似乎想在一些 JavaScript 代码中插入一个 Ruby 变量。
  • @the Tin Man,var filename 更高。
  • 是的,这些是 Ruby 字符串,通过 #{...} 中的字符串插值注入到 JavaScript 代码中。

标签: ruby ruby-on-rails-3 variables haml inject


【解决方案1】:

这个:

ajax_download_report_admin_reports_url(" + filename+ ")

将在 Ruby 中调用一个带有参数的方法:

" + filename+ "

这就是你看到的原因:

:file=>" + filename+ "

JavaScript 是在浏览器中运行的客户端,无法接触服务器上的 Ruby 代码,因此 JavaScript 变量 filename 对 Ruby 是不可见的,并且无法访问,除非您将 filename 的值发送回服务器以某种方式。


过去,当我有类似需求时,我所做的是生成 URL 并将其存储在 JavaScript 变量定义中,然后使用 JavaScript 字符串连接将 URL 插入正确的位置。注意这是做什么的:

File.dirname("http://foo.bar/baz/bor.html")
=> "http://foo.bar/baz"

它会删除资源名称并仅保留基本 URL。使用它:

:javascript
  var admin_reports_base_url = "#{ File.dirname(ajax_download_report_admin_reports_url('foo')) }/"
  var updaterId = setInterval(function() {
    $.ajax({
      url: #{admin_reports_url.to_json},
      dataType: "json",
      type:  "GET",
      data: {job_id: "#{job_id}"},
      success: function(response){
        var filename = response.file;
        switch(status) {
          case 'failed':
            $('.loader').hide();
            clearInterval(updaterId);
            alert(message);
            break;
          case 'completed':
            $('.loader').hide();
            clearInterval(updaterId);
            location.href = admin_reports_base_url + filename;
            break;
        }
      }
    })}, 1000);

【讨论】:

    【解决方案2】:
    def get_url(x)
       return "a url: #{x}"
    end
    
    filename = 'abcd'
    
    puts "#{get_url(filename)}"
    
    --output:--
    a url: abcd
    

    但是您正在尝试使用一个名为 filename 的 js 变量,该变量在页面发送到浏览器之后以及一段时间后进行 ajax 调用之后才存在,现在正在执行的一些 ruby​​ 代码中。没办法。

    【讨论】:

      【解决方案3】:

      一种解决方案是不使用 ruby​​ 代码。

      例如:

      location.href = "admin/reports/ajax_download_report?file=" + filename;
      

      【讨论】:

      • 硬编码它会起作用,但会否定ajax_download_report_admin_reports_url()的值。
      • 你说得对,但他的问题还有其他解决方案吗?
      • 是的。请参阅我的答案中添加的部分。
      【解决方案4】:
      "#{ajax_download_report_admin_reports_url('')}" + filename
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        相关资源
        最近更新 更多