如何使用HAML将JavaScript变量注入Ruby代码?

时间:2013-06-27 05:18:21

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

我试图将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无法正确评估此代码。

4 个答案:

答案 0 :(得分:1)

此:

ajax_download_report_admin_reports_url(" + filename+ ")

将使用参数:

在Ruby中调用方法
" + filename+ "

这就是你看到的原因:

:file=>" + filename+ "

JavaScript是在浏览器内部运行的客户端,无法触及服务器上的Ruby代码,因此除了发送{{1}的值之外,JavaScript变量filename对Ruby是不可见的并且无法访问以某种方式回到服务器。


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

filename

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

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

答案 1 :(得分:0)

def get_url(x)
   return "a url: #{x}"
end

filename = 'abcd'

puts "#{get_url(filename)}"

--output:--
a url: abcd

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

答案 2 :(得分:0)

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

例如:

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

答案 3 :(得分:0)

"#{ajax_download_report_admin_reports_url('')}" + filename