2017-03-13 45 views
0

我在我的視圖中有以下循環顯示給定錦標賽中的所有分區。當我嘗試複製控制器中的邏輯時,將該變量傳遞給視圖,I和「未定義的方法」錯誤。任何幫助我做錯了將不勝感激。Rails邏輯在視圖中工作,但不是控制器

模型

class Tournament < ApplicationRecord 
    has_and_belongs_to_many :divisions 
end 
class Division < ApplicationRecord 
    has_and_belongs_to_many :tournaments 
end 

工作負責人&查看 控制器

def index 
    @tournaments = Tournament.all 
end 

查看

<% tournament.divisions.ids.each do |tdi| %> 
    <%= Division.find(tdi).name %> 
<% end %> 

不工作控制器&查看 控制器

def index 
    @tournaments = Tournament.all 
    @tournaments.divisions.ids.each do |tdi| 
     @divisions = Division.find(tdi).name 
    end 
    end 

查看

<%= @divisions %> 

當我嘗試第二個(我敢肯定,更正確的)實現,我得到一個「未定義的方法'分裂」錯誤在下面一行索引方法:

@tournaments.divisions.ids.each do |tdi| 
+0

最可能的@divisions是在每個循環內。範圍只是在該循環內 – DroidNoob

回答

1

的問題是,這@tournaments = Tournament.all線返回tournament對象的列表。因此,在第二行中,您不能將對象列表與任何類型的關聯關聯起來。你必須遍歷@tournaments,然後找到每個錦標賽的divisions

def index 
    @tournaments = Tournament.all 
    # you can also eager load the tournamnets 
    # @tournaments = Tournament.includes(:divisions) 
    @tournaments.each do |tournament| 
     tournament.divisions.ids.each do |tdi| 
      @divisions = Division.find(tdi).name 
     end 
    end 
    end 
+1

感謝您這麼清楚地解釋這一點。得到它了 ! – afishintaiwan

+0

@afishintaiwan,歡迎光臨。 :) – Emu

0

我認爲錯誤告訴你的是,方法ids不是一種劃分方法。 Yo將不得不將該方法定義爲您的分區模型中的範圍。

scope :ids, -> { pluck(:id) } 

另一件事是,我不明白爲什麼你試圖做這樣的事情:

<% tournament.divisions.ids.each do |tdi| %> 
    <%= Division.find(tdi).name %> 
<% end %> 

時,你可以只是簡單的做到這一點:

<% tournament.divisions.each do |tdi| %> 
    <%= tdi.name %> 
<% end %> 
0

第一件事,在第二種情況下,您正在調用關於收集的關聯,您需要在控制器中執行此操作,最終您需要所有的分區名稱,在這裏您還有n + 1查詢問題,因此要解決這個問題

def index 
    @tournaments = Tournament.includes(:divisions) 
end 

鑑於

@tournaments.each do |tournament| 
    tournament.divisions.each do |division| 
    <%= division.name %> 
    <% end %> 
<% end %> 

希望幫助!

相關問題