2013-06-27 30 views
1

我想给filename JavaScript变量注入到我的Ruby代码是这样的:如何使用HAML将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不能正常evalute此代码。

+0

它看起来并不像你试图注入一个JavaScript变量为Ruby代码,这是行不通的。相反,它看起来像你想要在一些JavaScript代码中插入一个Ruby变量。 –

+0

@锡文,var文件名向上。 – 7stud

+0

是的,那些Ruby字符串是通过'#{...}'内部的字符串插值注入到JavaScript代码中的。 –

回答

1

此:

ajax_download_report_admin_reports_url(" + filename+ ") 

是要调用一个方法在红宝石的参数:

" + 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); 
0
def get_url(x) 
    return "a url: #{x}" 
end 

filename = 'abcd' 

puts "#{get_url(filename)}" 

--output:-- 
a url: abcd 

但是你要使用正在执行名为filename一个js变量,它不存在,直到页面发送到浏览器后一个Ajax调用了一段时间后后,在一些Ruby代码现在。没有可以做的。

0

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

如:

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

硬编码它会工作,但否定'ajax_download_report_admin_reports_url()'的价值。 –

+0

你说得对,但有没有其他解决方案可以解决他的问题? – 2013-06-27 06:35:11

+0

是的。在我的答案中看到添加的部分。 –

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