【问题标题】:How do I use a controller method in the main layout?如何在主布局中使用控制器方法?
【发布时间】:2013-08-08 14:17:21
【问题描述】:

我已经构建了一个“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”来使其可用。

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

非常感谢您的帮助。

问候,拉塞尔

【问题讨论】:

    标签: ruby-on-rails controller helper


    【解决方案1】:

    尝试分离逻辑。也许您创建了一个名为 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
    

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

    【讨论】:

    • 谢谢,我同意你的第二个建议。很好的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多