1

我正在尝试将filenameJavaScript 变量注入到我的 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 无法正确评估此代码。

4

4 回答 4

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);
于 2013-06-27T06:19:42.647 回答
0

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

例如:

location.href = "admin/reports/ajax_download_report?file=" + filename;
于 2013-06-27T06:20:06.233 回答
0
"#{ajax_download_report_admin_reports_url('')}" + filename
于 2013-06-27T06:40:27.580 回答
0
def get_url(x)
   return "a url: #{x}"
end

filename = 'abcd'

puts "#{get_url(filename)}"

--output:--
a url: abcd

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

于 2013-06-27T05:36:11.597 回答