簡體   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