rails部分视图中的动态数据

时间:2012-01-08 14:44:25

标签: ruby-on-rails ruby ruby-on-rails-3 partial-views

我刚开始在我的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&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>

我尝试在类别控制器中添加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文件中传入部分对象,这些对象通常来自类别控制器中的控制器方法?

任何帮助都会很棒。

3 个答案:

答案 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 %> &raquo;    </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 %> &raquo; </a></li>

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

结果与@timbrandes概述的建议相同,(查看他链接到的文档)。

我听说:收藏可以改善您的表现。 http://rails-bestpractices.com/posts/38-use-render-collection-rails-3-when-possible

答案 2 :(得分:0)

这不是正确的做法,你的问题相当令人困惑。

我要说你还要读铁轨书。你似乎仍然有点太新鲜了

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

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

如果要调用视图中的任何方法,则应在帮助程序中定义它们。尽管如此,他们将操纵的唯一数据是从控制器传递的数据作为实例变量。