2013-03-26 27 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

相关问题