如何在主布局中使用控制器方法?

时间:2013-08-08 14:17:22

标签: ruby-on-rails controller helper

我构建了一个'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'来实现这一目标。

我觉得我在这里遗漏了一些东西而不理解整个过程。

非常感谢您的帮助。

问候,拉塞尔

1 个答案:

答案 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

然后只需从您的控制器调用它即可,以便您可以在视图中使用它并使用视图中的部分迭代它。