我刚开始在我的rails应用程序中使用Partials,目前我在application.html.erb中有以下代码
<%= render 'categories/categorieslist' %>
这链接到我的views / categories /文件夹中的_categorieslist.html.erb
此时此部分包含硬编码超链接
<ul class="unstyled">
<li style="padding-bottom:5px"><a href="#">Item A»</a></li>
<li style="padding-bottom:5px"><a href="#">Item B»</a></li>
</ul>
我的目标是让这些类别来自数据库,例如
<ul class="unstyled">
<% @categories.each do |category| %>
<li style="padding-bottom:5px"><a href="#"><%= category.name %> » </a></li>
<% end %>
</ul>
我尝试在类别控制器中添加categorieslist方法,例如
def categorieslist
@categories = Category.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @categories }
end
end
但这不是由部分调用的(我觉得这甚至不是正确的方法),并且显示错误
NoMethodError in Store#index
在&lt;%@ categories.each do | category |行上%GT;
我的问题是我如何在application.html.erb文件中传入部分对象,这些对象通常来自类别控制器中的控制器方法?
任何帮助都会很棒。
答案 0 :(得分: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 %> » </a></li>
<% end %>
</ul>
有关详细信息(以及长版本),请参阅Rails指南中的3.4.4 Passing Local Variables。
答案 1 :(得分:0)
我会为此使用一个集合:
<%= render 'categories/categorieslist', :collection => @categories, :as => :category %>
这会呈现一组项目。在这种情况下,所有类别。您也可以使用以下内容为其传递自定义名称:as =&gt;
然后在你的部分中,你只包括你希望渲染集合中的项目的东西:
<li style="padding-bottom:5px"><a href="#"><%= category.name %> » </a></li>
-ul-不包括在内,因为它会被多次渲染。你需要将它包装在你的渲染标签周围。
结果与@timbrandes概述的建议相同,(查看他链接到的文档)。
我听说:收藏可以改善您的表现。 http://rails-bestpractices.com/posts/38-use-render-collection-rails-3-when-possible
答案 2 :(得分:0)
这不是正确的做法,你的问题相当令人困惑。
我要说你还要读铁轨书。你似乎仍然有点太新鲜了
无论如何,控制器方法通常代表http请求。并根据config / routes文件中定义的内容调用它们。视图(* .erb)通常不会调用控制器方法。如果他们这样做,他们会通过ajax请求来完成。
数据通过控制器实例变量从操作传递到视图。
如果要调用视图中的任何方法,则应在帮助程序中定义它们。尽管如此,他们将操纵的唯一数据是从控制器传递的数据作为实例变量。