2013-03-26 48 views
1

我有一個Modality模型與相關模型ModalityItem。情態有很多:modality_items和ModalityItem屬於:情態。我想要顯示的其中一個字段是來自MediaLibrary的名稱字段,其中id與ModalityItem中的media_library_id匹配。Ruby on Rails 3.2.13 - 如何引用fields_for中的字段?

我打算允許每個Modality最多15個ModalityItem行。當需要添加新記錄時,Rails應用程序將顯示ModalityItem的空白行,或者存在記錄時顯示ModalityItem行數據。

這裏是我在modalities_controller的編輯方法中的代碼,我也可以重命名模態。我創建了數組@items(Array.new(15)),並使用ModalityItem或ModalityItem.new中的一行加載每個數組元素。如果所選Modality不存在ModalityItem行,則整個數組將具有15個ModalityItem.new元素。如果存在ModalityItem行,我想將行連接到相應的MediaLibrary行並在編輯視圖中顯示其名稱。

@modality = Modality.find(params[:id]) 
@modality_items = ModalityItem.joins('JOIN media_libraries ON media_libraries.id = modality_items.media_library_id').where("modality_id = ?", @modality.id).all 
@items = Array.new(15) 

count = 0 
while count < @items.size 
    if @modality_items && count < @modality_items.size 
    @items[count] = @modality_items[count] 
    else 
    @items[count] = ModalityItem.new 
    end 
    count += 1 
end 

這是我在編輯視圖中的代碼。

<%= form_for(@modality) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <p style="font-weight: bold; font-size: 114%;"><%= link_to "Return to Manage Modalities", modalities_path %></p><br> 
    <%= f.label :name, "Modality Name:" %>&nbsp;<%= f.text_field :name %><br><br> 
    <%= f.fields_for :modality_items, @items do |item| %> 
    <div class="modality-class"> 
     <%= item.label :media_library_id, "Media Library" %><%= item.text_field :media_library_id %> 
     <div class="short-label"><%= item.label :rank, "Rank" %></div><%= item.text_field :rank %> 
    </div><br><br> 
    <div class="modality-instruct"> 
     <%= item.label :instructions, "Instructions" %><%= item.text_field :instructions %> 
    </div><br><br> 
    <% end %> 
    <%= f.submit "Save changes to Modality", class: "btn btn-medium btn-custom" %><br><br> 
    <p style="font-size: 114%; font-weight: bold;"><%= link_to "Delete this modality?", @modality, method: :delete, data: { confirm: "You sure you want to Delete this modality?" } %></p> 
<% end %> 

我只用fields_for用在哪裏拍攝的多個項目的ID號在我的下拉列表中的一個數組collection_select聲明。我使用這些ID創建了與正在更新的主表相關的另一個表。

在這種情況下,我想收集屏幕上輸入的信息,循環查看並創建我的記錄。我打算刪除Modality的所有現有ModalityItem行並每次重新創建它們。當我使用fields_for一個collection_select時,我設置一個實例變量@whatevername等於params [:whatevername],然後循環通過id。隨着我包含的代碼,我會設置@modality_items = params [:modality_items]然後做一些事情,我猜。我對當有人輸入數據並單擊該按鈕,更新會發生什麼了以下問題:

是什麼PARAMS [:modality_items]包含哪些內容?它是一個包含視圖中所有文本字段的數組嗎?

將@items從表單中的數據更新或將我必須保存params [:modality_items]?

我敢肯定,這是基本的信息,但是這是我第一次做這一點,並一直在尋找做許多網上搜索有關fields_for關閉後和好幾個月的答案是不成功的。

注:我目前還沒有從MediaLibrary引用的名字在我看來,因爲我需要了解如何在繼續之前訪問fields_for字段的詳細信息。我還遇到了以下問題:名稱同時位於Modality和MediaLibrary模型中。 Modality中的名稱是可更新的,但MediaLibrary的名稱只會顯示在fields_for語句中。

任何幫助,將不勝感激。

回答

0

什麼PARAMS [:modality_items]包含哪些內容?它是否包含視圖中所有 文本字段的數組?

什麼都沒有。你真的應該看看你的日誌文件來查看params哈希中的內容。

的:modality_items是嵌套在PARAMS數組[:模式]等你拿

params[:modality][:modality_items] 

所以form_for(@modality)讓你PARAMS [:模式],然後f.fields_for(注意在F從管道中的form_for)安排到嵌套模態散列內的fields_for PARAMS作爲數組

將@items與所述數據從所述表格被更新或我將不得不 節省PARAMS [:modality_items]?基本上modality_items爲modality_items_attributes你的情態模型內,這些屬性是可訪問(不保護,質量分配,然後你的行會自動更新或插入適當 accepts_nested_attributes_for接受嵌套attriobutes:

如果您正在使用accepts_nested_attributes_for。 params哈希表對應於相同的名字。

這從官方文檔鏈接清楚地解釋params哈希表是如何組織 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

並閱讀此處瞭解更多關於字段的詳細信息http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for

+0

我查看了日誌,但沒有點擊任何內容查看哈希DUH。我在Modality中接受了__mested_attributes_for:modality_items,但不知道如何將modality_items_attributes添加到我的attr_accessible列表中。我查看了fields_for信息,但解釋hash的第一個鏈接是我需要的。它不僅解釋了哈希如何工作,而且還將幫助我使用以下方法進行錯誤檢查:拒絕。當我在我的視圖中輸入少於15條記錄的數據時,我需要弄清楚我的錯誤檢查是如何工作的。我會嘗試這個併發布我的結果。謝謝你的信息,jamesw。 – 2013-03-26 18:50:04

+0

它運作良好。我只需要調整我的拒絕方法:Modality中的reject_if選項,這樣如果他們只輸入一個字段,我的模型中的錯誤檢查就可以工作。 params哈希鏈接是我缺少的鏈接。再次感謝!!!! – 2013-03-26 23:47:45