如何将变量从Rails传递给Ajax

时间:2015-11-14 17:57:44

标签: javascript jquery ruby-on-rails ruby ajax

我正在尝试使用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();
    }
 });});

3 个答案:

答案 0 :(得分:1)

这是一个可以帮助你做到这一点的宝石。它有很多解释和示例可以帮助您入门。

https://github.com/gazay/gon

答案 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缓存在会话之间共享。