2015-12-14 62 views
2

我新的軌道,我試圖建立一個視圖,將列出家長和孩子有關範圍內的每個上軌模板

例如: 護照有很多簽證

我想列出有關護照和護照簽證的信息。

所以我

<% @passport_list.each do |passport| %> 
    # passportFields 
    <% passport.visas.each do |visa| %> 
     <%= t.text_field :visa_type %> 
    <% end %> 
<% end %> 

,我發現了錯誤

undefined method `visa_type' for #Passport:0x000000091b8b28 

它看起來像Rails是試圖找到護照的財產visa_type,而不是簽證。示波器如何在each內工作?我可以強制它從visa訪問visa_type嗎?

+1

爲什麼你需要<%= t.text_field:visa_type%>?您只能使用<%= visa.visa_type%>顯示值。如果你想顯示某種形式,那麼你必須使用嵌套形式。 –

+0

sure @madyrockss,它是在一個表單中,我省略了這些信息,如果我像那樣使用<%= visa.visa_type%>,它可以工作,我該如何將它轉換爲text_field? – Saliba

回答

2

我認爲你正在尋找fields_for表單助手。這將允許您創建相關visa屬性的字段。用以下代碼替換您的代碼示例,並且應該全部設置好。

<% @passport_list.each do |passport| %> 
    # passportFields 
    <% t.fields_for :visas do |visa_fields| %> 
    <%= visa_fields.text_field :visa_type %> 
    <% end %> 
<% end %> 

你也可以遍歷列表如下:

<% @passport_list.each do |passport| %> 
    # passportFields 
    <% passport.visas.each do |visa| %> 
    <% t.fields_for :visas do |visa_fields| %> 
     <%= visa_fields.text_field :visa_type %> 
    <% end %> 
    <% end %> 
<% end %> 

欲瞭解更多有關fields_for,看看我在上面添加的鏈接,並進一步自定義你的使用情況,檢查出「一對多」部分。

1

IMO你應該總是處理對象的空情況。

事情是這樣的,如果你使用的軌道(目前?是Rails功能)...

<% if @passport_list.present? %> 
    <% @passport_list.each do |passport| %> 
    passportFields 
    <% passport.visas.each do |visa| %> 
     <%= t.text_field :visa_type %> 
    <%end%> 

    <%end%> 
<% else %> 
<p>Nothing to see here</p> 
<% end %> 

但是,如果你@passport_list由一個ActiveRecord查詢的支持,你可以在模型/助手處理此/控制器通過返回模型上的.none查詢。請注意,這從一個空數組不同,因爲它是一個ActiveRecord範圍,所以你可以鏈AR查詢到它

# scope on AR model 
def self.awesomeville 
    where(country_of_origin: "awesomeville") 
end 

# method queried in controller 
@passport_list = Passport.all 
if @passport_list.present? 
    @passport_list 
else 
    Passport.none 
end 

# additional filtering in view is now possible without fear of NoMethodError 
@passport_list.awesomeville 

而紅寶石陣列會產生一個錯誤,因爲它會在陣列的方法作出迴應。