繁体   English   中英

Rails ERB遍历数组

[英]Rails ERB iterate over array

我正在尝试使用块以及如何遍历ERB中的集合。 我有一对多关系的模型(Channel及其对应的类型)。

调节器

class HomePageController < ActionController
   def index
    @channels =  Channel.all
   end
end

然后在视图中,遍历属于Channel的所有属性。 当我想打印所有类型时,此代码为我提供了所需的输出:

视图

<% @channels.each do |channel| %>
    <% @types.each do |type| %>
        <%= Type.find(type).name %>
    <% end %>
<% end %>

最初,我尝试通过在整洁的单行代码中使用yield关键字来实现此目的,但是我无法设法将任何内容打印到浏览器,仅打印到控制台

<% @types.each {|type| yield Type.find(type).name } %>

是否有等效的单线?

首先,这种方法效率低下,您正在执行n查询,以查找Type每个记录,而不是通过使用控制器中的单个查询将它们转换为类型数组,并假设该数组位于type_ids

# controller
@channels = Channel.includes(:types) # avoiding n+1 queries

# view
<% @channels.each do |channel| %>
  # some channel info output
  <% channel.types.each do |type| %>
    <%= type.name %>
  <% end %> # types loop
<% end %> # channel loop

如@Almaron所述,您可以渲染部分以便于简化,如果您有一个名为_type.html.erb的部分,则可以直接调用render

# view
<%= render channel.types %>

Rails将进行所有的迭代和渲染。

首先,这种代码不属于视图。 不要从视图中处理数据库(在您的情况下为Type.find() )。 将其移动到它所属的控制器。

要注意的第二件事是<%=<%标签之间的区别。 第一个输出返回的结果,而第二个则不。 .each的问题在于它返回已使用过的对象,因此在您的情况下,如果您只是<%= @types.each {|type| Type.find(type).name } %> <%= @types.each {|type| Type.find(type).name } %>您将输出@types数组。

如果要简化该代码,则可以使用助手方法进行迭代,而可以使用一部分方法来呈现每个项目。 这样,您将得到如下内容: <% collection_iterate @items, 'item_partial' %>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM