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