0

我已经构建了一个“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' 调用以更改返回的项目数。

问题是当页面首次加载时,“新闻”DIV 为空 10 秒,直到 JavaScript 运行以更新 DIV。所以我想通过调用这个函数来确保 DIV 已经被填充。

现在,我希望“新闻”DIV 在所有页面中都可用,它在“layouts/application.html.erb”模板中定义。所以我需要调用“NewsItem”控制器中的“top”方法,以便将其呈现为初始 HTML。这是我苦苦挣扎的地方,因为在这个阶段我无法弄清楚如何使用“helper_method”来使其可用。

我有一种感觉,我在这里遗漏了一些东西,并且不了解整个过程。

非常感谢您的帮助。

问候, 拉塞尔

4

1 回答 1

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

然后只需从您的控制器中调用它来获取它,这样您就可以在您的视图中使用它并在您的视图中使用部分迭代它。

于 2013-08-08T14:31:28.630 回答