2013-06-27 68 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