如何将变量从Rails传递到Ajax

3

我正在尝试在Ruby on Rails应用程序中使用JavaScript实现进度条,但是我无法将值从控制器传递到JS以更新进度条。

最初,我尝试使用简单的全局变量($count),但一旦加载,变量始终相同。它在JS方面没有更新。

编辑:

现在我正在使用gon宝石来传递值。但是我只得到第一个值(当控制器启动时设置的值)。当我调用由按钮点击触发的方法时,该值会更新,但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();
    }
 });});
3个回答

1

我已经尝试过gon gem,但它也没有起作用。在尝试访问JS侧的变量时会出现错误“:undefined”。你知道这个错误吗? - koxta
你如何在后端设置gon变量并在JS端调用它? - Jones Agyemang
在控制器中,我设置了 gon.var=50,在 js 文件中,我尝试获取 gon.var。只需要在 HTML 文件的头部使用 require gon 即可。 - koxta
我正在使用gon,现在我可以获取第一个值(当控制器启动时)。但是当搜索按钮被点击时,我无法在特定方法内更新该值。我认为问题出在方法上。如果您能找到问题,请查看新代码。谢谢。 - koxta

0

我相信这个链接可以满足你的需求。你不需要使用Gon gem。你只需要做'<%= var %>'。

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 中,获取该数据属性。但这是一种反模式。


正如我在帖子中提到的更改,也许这是控制器的问题。只有当控制器启动时,我才能获取变量的值。当我调用搜索时,变量没有被更新。 如果您能找到问题,请查看新代码。谢谢。 - koxta

0

问题似乎与类有关。当Ajax尝试访问类控制器内的方法时,它会再次实例化并清除所有变量。 我通过使用Rails.cache.write(:count,0)Rails.cache.read(:count)来解决了这个问题以渲染数值。 提示:不适用于多用户。Rails缓存在会话之间是共享的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接