[英]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.