我正在尝试使用Ruby on Rails应用程序实现进度条(Javascript),但是我无法将值从控制器传递到JS以更新条。
最初,我尝试使用一个简单的全局变量( $ count )但是一旦加载,变量总是相同的。它没有在JS方面更新。
修改
现在我正在使用gon gem来传递值。但我只得到第一个值(控制器启动时设置)。当我调用按钮单击触发的方法时,值会更新,但gon变量始终相同。可能是rails / controller中的错误?
我看到了一个示例,其中包含一个将变量公开给gon但不起作用的方法。
注意:如果在搜索之前删除初始化,如果在单击搜索时JS侧显示“gon变量未定义”
示例代码: application_controller.rb
def application
@count =0 #gon assumes only this value
exposeUnProcessedJobToJavascript
if params[:search]
while(@count < 10)
exposeUnProcessedJobToJavascript
sleep 3
@count +=1
end
end
def exposeUnProcessedJobToJavascript
gon.watch.job = @count
end
end
application.js.erb
function addJobWatchers() {
if (gon.job != undefined) {
gon.watch('job', {
interval: 1000
}, updateProcessingJob);
}
}
function updateProcessingJob(job) {
if (job) {
console.log("JOB: " + job);
}
}
$(document).on('page:change', function() {
$("#search_button").click(function() {
console.log("click search");
if (typeof gon !== 'undefined') {
addJobWatchers();
}
});});
答案 0 :(得分:1)
这是一个可以帮助你做到这一点的宝石。它有很多解释和示例可以帮助您入门。
答案 1 :(得分:0)
我相信这个链接可以满足您的需求。你不应该需要Gon宝石。您只需要执行&#39;&lt;%= var%&gt;&#39;
http://railscasts.com/episodes/324-passing-data-to-javascript?view=asciicast
<%= javascript_tag do %>
window.productsURL = '<%= j products_url %>';
window.products = <%= raw Product.limit(10).to_json %>
<% end %>
不是最佳实践方式:
由于您的模板中已全局拥有@count。将其设置为数据属性。然后在你的javascript中,获取该数据属性。但这是一种反模式。
答案 2 :(得分:0)
问题似乎与班级有关。当Ajax尝试访问类控制器内部的方法时,会再次实例化清除所有变量。 我使用 Rails.cache.write(:count,0)和 Rails.cache.read(:count)来解决问题,以呈现值。 提示:不适用于多用户。 Rails缓存在会话之间共享。