2014-05-05 34 views
1

我在TrainerSportists之間有belongs_to/has_many關係。我通過自己的價值觀view試圖循環是這樣的:ActionView :: Template :: Error(未定義的方法`city'爲零:NilClass):

<% @sportists.each do |s| %> 
<%= s.name %> <%= s.surname %> 
<%= s.trainer.city %> 
<% end %> 

Sportist相關信息能正常工作,但trainers - 不。我得到了標題中給出的錯誤。如果我在rails console中試圖做到這一切,所以關係應該設置好。

事情我已經嘗試:

<% s.trainers.each do |t| %> 
    <%= t.city %> 
<% end %> 

,讓我undefined method 'trainers'錯誤,如果我嘗試s.trainer我得到

#<TRAINER:0X00000004CE7CB0>

那麼可能是什麼解決?

編輯

我的模型:

教練

has_many :sportists 
belongs_to :team 
accepts_nested_attributes_for :sportists, :reject_if => :all_blank, :allow_destroy => true 

Sportist

belongs_to :trainer 

控制器

@sportists = Sportist.all 
+0

安置自己的產品型號代碼。 – Pavan

+0

@Pavan使用Model信息編輯了我的帖子。 – Xeen

+0

「code snippet」所屬的'view page'屬於哪個? – Pavan

回答

2

你得到undefined method 'city' for nil:NilClass在下面的代碼:

<% @sportists.each do |s| %> 
<%= s.name %> <%= s.surname %> 
<%= s.trainer.city %> 
<% end %> 

這意味着有是沒有關聯到它trainer一個sportists記錄。 因此,對於那個特定的體育列表記錄s.trainernil,您不能在nil對象上調用city

要確定sportist記錄您不具有關聯trainer,只需更新如下視圖代碼:

<% @sportists.each do |s| %> 
<%= s.name %> <%= s.surname %> 
<%= s.trainer.try(:city) %> 
<% end %> 

這樣,即使你沒有相關的trainer記錄,錯誤不會被提出。 在呈現視圖中,只需查找sportlist記錄,該記錄不會顯示任何city,這將是沒有關聯的trainersportlist記錄。

至於您在

<% s.trainers.each do |t| %> 
    <%= t.city %> 
<% end %> 

sportlist收到belongs_to的trainer第二個錯誤undefined method 'trainers',你只有動態方法trainer(注單數)提供,並沒有trainers(注複數)。另外,s.trainer會返回單個培訓師記錄,因此您無法使用each方法對其進行迭代,因爲它不是一個集合,而是一條記錄。

UPDATE

理想情況下,你不應該允許的sportist記錄創建無trainer。 您應該在sportlists表上創建的外鍵trainer_id上添加index有了這個,你甚至不必使用try方法,你的當前代碼就可以正常工作。

+0

我想和@安頓格里戈裏耶夫所說的一樣。我會建議不要使用try方法,而是使用委託方法。這是Rails的最佳實踐之一。 – Addicted

+0

我不明白「委託」如何解決它。 '委託人'將再次被稱爲'trainer.city',即委託給'教練員'。可能你可以解釋。 –

0

似乎你有一個sportists沒有trainer。爲了避免這種情況,請使用if這樣的條件。

<% @sportists.each do |s| %> 
<%= s.name %> <%= s.surname %> 
<%= s.trainer.city if s.trianer.present?%> 
<% end %> 

而且還設置驗證在Sportist模型應該解決空trainer_id

Class Sportist < ActiveRecord::Base 

belongs_to :trainer 

validates :trainer_id, presence: true 

end 
+0

你爲什麼建議如果條件。 – Addicted

+0

@Addicted,以便它檢查相關的培訓師是否存在。如果存在,則打印培訓師城市值。 – Pavan

+0

我想說明一點,我們不應該不必要地使用條件。 – Addicted

0

您可以更新您的代碼

<% @sportists.each do |s| %> 
    <%= s.name %> <%= s.surname %> 
    <%= s.trainer.city %> 
    <% end %> 

<% @sportists.each do |s| %> 
    <%= s.name %> <%= s.surname %> 
    <%= s.trainer.present? ? s.trainer.city : "No City Found" %> 
    <% end %> 

這將停止代碼拋出零誤差

2

您可以使用委託的,並避免使用try, if and terniary operator

Sportist

belongs_to :trainer 

delegate :city, to: :trainer, :allow_nil => true 

你需要作出小改動現有的代碼,它會工作順利:)

<% @sportists.each do |s| %> 
    <%= s.name %> <%= s.surname %> 
    <%= s.city %> 
<% end %> 
相關問題