当我通过Ajax请求刷新部分时,为什么我的实例变量为空?

时间:2016-02-03 15:38:11

标签: javascript jquery ruby-on-rails ajax

我的视图中有一张桌子,我希望每60秒自动刷新一次。我按照this question的答案来实现这一点。在我的表格中,我正在显示下面变量@available_posts_data的数据。

所以我有一个Javascript来执行此操作:

(document).ready(function () {
    setInterval(refreshPartial, 60000);

});

function refreshPartial() {
  $.ajax({
    url: "posts/refresh_part"
 });
}

然后,在我的Posts控制器中,我有以下方法:

def home    
  @posts = Post.order(:id)
  @available_posts_data = get_available_posts_data()
end

#method to refresh the tables of posts and the data.
def refresh_part
  #get updated data based on posts
  @available_posts_data = get_available_posts_data()
  respond_to do |format|
    format.js
  end
end

private 
def get_available_posts_data()
   #this method does something with @posts and returns an array of updated data.
   .
   .
   .
end

现在,有了上述内容,经过60多年的刷新后,我发现我的桌子已经空了。

结果显示get_available_posts_data()中的方法refresh_part()正在返回一个空数组,因为@post为空!为了让它适合我,我必须修改refresh_part,如下所示:

def refresh_part
  #re-query for the @post variable!
  @posts = Post.order(:id)
  @available_posts_data = get_available_posts_data()
  respond_to do |format|
    format.js
  end
end

为什么我需要重新设置实例变量@post?我有点期待对posts / refresh_part url的Ajax请求将指向Post控制器的同一个实例,@posts应该可供我使用,因为home函数会有已经设置了一次。

这里似乎很简单,我在这里失踪了......在这种情况下,让@post成为类变量@@post会更好吗?

1 个答案:

答案 0 :(得分:0)

我认为你误解了实例变量,他们不会坚持多个请求 - 每个对Posts控制器的请求都会创建一组新的实例变量。

因此,它确实需要再次设置,但要删除重复,您可以添加前过滤器:

class PostsController < ApplicationController
  before_action :find_post

  def home 
   #code
  end

  def refresh_part
   #code
  end

  private

  def get_available_posts_data()
   #code
  end

  def find_post
    @post = Post.order(:id)
  end

然后,@ post将在控制器的所有功能中可用。如果您向该类添加更多功能但只想要某些功能,则可以执行以下操作:

before_action :find_post, only: [:home, :refresh_part]