我构建了一个'NewsItem'控制器,其中包含一个名为'top'的方法。这是通过javascript请求来调用的,每10秒更新一次页面上的DIV。这一切都运作良好。
def top(number = false)
# set the default value to use for the number
default_number = 10;
# perform checks on the variable
if number == false
if params.include?(:number)
number = params[:number]
else
number = default_number
end
end
# Run query to get the required news items
items = NewsItem.all( :order => ("created_at DESC"),
:include => [:profile],
:limit => number)
# iterate around the items that have been returned
@top_news = ""
items.each do |item|
@top_news += render_to_string :partial => "partials/news_item", :locals => {:item => item}
end
respond_to do |format|
format.html { render :partial => "partials/news_top"}
end
end
使用'/ news / top'或'/ news / top / 20'调用此方法来更改返回的项目数。
问题是,当首次加载页面时,'news'DIV为空10秒,直到JavaScript运行以更新DIV。所以我想通过调用这个函数来确保已经填充了DIV。
现在我希望'news'DIV可以在所有页面中使用,它在'layouts / application.html.erb'模板中定义。因此,我需要在'NewsItem'控制器中调用'top'方法,以便将其呈现为初始HTML。这是我正在努力的地方,因为我无法弄清楚如何在这个阶段使用'helper_method'来实现这一目标。
我觉得我在这里遗漏了一些东西而不理解整个过程。
非常感谢您的帮助。
问候,拉塞尔
答案 0 :(得分:0)
尝试分离逻辑。也许你创建了一个名为top_news的方法,它返回你在top_news中使用的值。因为你传回了一部分,所以用它来构建字符串。部分用于迭代列表。
def index
@top_news = top_news
end
def top
@top_news = top_news
respond_to do |format|
format.html { render :partial => "partials/news_top"}
end
end
private
def top_news(number = false)
# set the default value to use for the number
default_number = 10;
# perform checks on the variable
if number == false
if params.include?(:number)
number = params[:number]
else
number = default_number
end
end
# Run query to get the required news items
items = NewsItem.all( :order => ("created_at DESC"),
:include => [:profile],
:limit => number)
# iterate around the items that have been returned
return render_to_string :partial => "partials/news_item", :collection => items, :as => :item
end
您可以遵循的另一个解决方案是,除了您的一个javascript方法之外,不会在控制器中渲染任何部分,而是在模型中创建一个方法来完成您在此处所做的事情。
class NewsItem
def top_news(number=20) # pass in number with default 20
NewsItem.where( :order => ("created_at DESC"),
:include => [:profile],
:limit => number)
end
end
然后只需从您的控制器调用它即可,以便您可以在视图中使用它并使用视图中的部分迭代它。