2012-01-08 63 views
1

我刚开始在我的Rails应用程序中使用局部模板,此刻我有下面的代码在我application.html.erb动态数据

<%= render 'categories/categorieslist' %> 

此链接_categorieslist.html .erb在我的意见/类别/文件夹

目前这部分包含硬编码的超链接

<ul class="unstyled"> 
    <li style="padding-bottom:5px"><a href="#">Item A&raquo;</a></li> 
    <li style="padding-bottom:5px"><a href="#">Item B&raquo;</a></li> 
</ul> 

我的目标是让这些类别来自数据库,如

<ul class="unstyled"> 
    <% @categories.each do |category| %> 
     <li style="padding-bottom:5px"><a href="#"><%= category.name %> &raquo; </a></li> 
    <% end %> 
</ul> 

我试图在类别控制器如

def categorieslist 
@categories = Category.all 
    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @categories } 
    end 
    end 

添加categorieslist方法,但这种不会被调用的部分(我不觉得这是连做正确的方法它),并呈现出就行了<%@ categories.each错误

NoMethodError in Store#index 

做|类别| %>

我的问题是我如何传递到application.html.erb文件中的部分,这些类别对象通常来自类别控制器中的控制器方法?

任何帮助将是伟大的。

回答

3

您可以发送locales您的视图中的部分调用并将变量传递给该部分。

例如(这是一个局部的快捷方式):从中调用部分

<%= render 'categories/categorieslist', :all_categories => @categories %> 

你的部分类别/ _categorieslist.html.erb(注意没有@与

您的看法变量)

<ul class="unstyled"> 
    <% all_categories.each do |category| %> 
    <li style="padding-bottom:5px"><a href="#"><%= category.name %> &raquo; </a></li> 
    <% end %> 
</ul> 

如需进一步信息(和长版本),见在滑轨指南3.4.4 Passing Local Variables

+0

谢谢,我不太清楚的一件事是如何安排代码,以便传入此部分的@ categories集合通过调用@ categories = Category.all来填充,此activerecord查询的位置应该放在哪里代码,如果部分是在布局文件application.html.erb中? – norbert 2012-01-10 07:58:27

+0

如果它在application.html.erb中,它应该放到你的ApplicationController中。在这里,你可以使用before_filter和def'get_cats @categories = Category.all end'这样的方法,或者你可以用'<%= render'categories/categorieslist'直接调用方法(它返回方法中的最后一个值) ,:all_categories => get_cats%>' – 2012-01-10 08:44:42

+0

这太好了,我不确定是否有可能在ApplicationController中包含这样的东西,并没有找到任何明确的例子,谢谢! – norbert 2012-01-10 09:09:01

0

我会使用一个集合这样的:

<%= render 'categories/categorieslist', :collection => @categories, :as => :category %> 

这使得项目的集合。在这种情况下,所有的类别。您还可以使用:as =>将自定义名称传递给它。

然后在你的部分只包括你想要的集合中的项呈现的东西:

<li style="padding-bottom:5px"><a href="#"><%= category.name %> &raquo; </a></li> 

的-ul-不包括因为它会被渲染多次。你需要将它包装在你的渲染标签中。

结果与@timbrandes提出的建议相同(请查看他链接到的文档)。

我听说过:集合可以提高性能。 http://rails-bestpractices.com/posts/38-use-render-collection-rails-3-when-possible

0

这不是正确的做法,而你的问题相当混乱。

我想说,你仍然必须读一本滑轨书。你似乎仍然有点太新

无论如何,控制器方法通常代表http请求。并且它们被相应地调用到config/routes文件中定义的内容。视图(* .erb)通常不会调用控制器方法。如果他们这样做,他们通过ajax请求。

数据通过控制器实例变量从动作传递给视图。

如果你想调用视图内的任何方法,它们应该在助手中定义。但是,他们将操作的唯一数据是从控制器作为实例变量传递的数据。