这里其他最好的答案都是正确的,无法通过将javascript变量传递到erb局部模板中来实现,因为它是在服务器上呈现的,而不是在客户端。
但是,由于任何寻找此解决方案的人可能都对解决方法感兴趣,而我在这里没有看到,因此我将发布这个示例,该示例与Rails UJS和Turbolinks配合使用效果很好。
首先,您设置控制器以返回HTML作为局部模板:
format.html { render partial: "new_expense" }
接下来,在
app/views/expenses/new_daily.js.erb
中编写一个 JavaScript AJAX 函数:
var i = parseInt($('#daily').attr('data-num')) + 1;
$.ajax({
url: '/daily',
type: 'GET',
dataType: 'html',
contentType: "application/html",
success: function(response) {
$('#daily').replaceWith(response)
$('#daily').attr('data-num', i);
}
});
这将会获取你的Rails partial作为一个html片段,你可以用它来替换你渲染页面的那一部分。你可以使用jQuery来获取你的
data-num
属性值,进行一些数学计算,在视图中替换partial,然后再次设置属性值。
你可能会问,为什么要费这么大劲去获取Rails partial并在页面上替换它,而不是只获取数据属性,对其进行数学计算,然后设置它?答案是,这是在处理UJS渲染Rails partial时处理异步响应时真正必要的最佳方法,也许是唯一的方法。
如果您正在处理来自服务器的异步响应,例如在
create.js.erb
模板中,则您的变量(例如@daily)不会反映出请求完成后所做的工作(例如,在像Sidekiq这样的后台服务器上进行处理)。在这种情况下,您没有最新的操作响应变量可以传递到
js.erb
文件中的Rails partial中,但是您也不能将javascript
data
响应传递到partial中,如本问题所指出的那样。
据我所知,这种方法是在接收到异步响应后获取完全更新的partial的唯一方法(未显示)。这使您可以获得最新的partial,允许您将javascript嵌入其中,并且足够灵活,可以在几乎任何用例中工作。