我的视图中有一张桌子,我希望每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
会更好吗?
答案 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]