我有一个模态模型和一个相关的模型ModalityItem。Modality有很多:modality_items,ModalityItem属于:modality。我想要显示的其中一个字段是来自MediaLibrary的name字段,其中id与ModalityItem中的media_library_id匹配。
我计划为每个通道允许最多15个ModalityItem行。Rails应用程序将在需要添加新记录时为ModalityItem显示空白行,或者在存在记录时显示ModalityItem行数据。
这是我在modalities_controller的编辑方法中的代码,我还可以在其中重命名Modality。我已经创建了数组@items (Array.new(15)),并用ModalityItem或ModalityItem.new中的一行加载每个数组元素。如果所选医疗设备不存在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:" %> <%= 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 %>我只在collection_select语句中使用了fields_for,在该语句中,我以数组的形式捕获了下拉列表中多个项目的id号。我使用这些ids创建了另一个与我正在更新的主表相关的表。
在这个场景中,我想要收集在屏幕上输入的信息,遍历它并创建我的记录。我计划删除某个医疗设备的所有现有ModalityItem行,并在每次重新创建它们。当我使用带有collection_select的fields_for时,我将实例变量@whatevername设置为等于params:whatevername,然后遍历ids。使用我包含的代码,我想我会设置@modality_items = params:modality_items,然后用它做一些事情。我有以下问题,当有人输入数据并单击按钮进行更新时会发生什么:
params:modality_items包含什么?它是包含视图中所有文本字段的数组吗?
@items将使用表单中的数据进行更新,还是必须保存params:modality_items
我确信这是基本信息,但这是我第一次这样做,几个月来断断续续地在网上搜索了很多关于fields_for的信息后,一直没能找到答案。
注意:我目前没有在视图中引用来自MediaLibrary的名称,因为在继续之前,我需要更多关于如何访问fields_for中的字段的信息。我还有一个问题:name同时存在于Modality和MediaLibrary模型中。模态中的名称是可更新的,但MediaLibrary的名称将仅显示在fields_for语句中。
任何帮助都将不胜感激。
发布于 2013-03-27 01:26:03
params:modality_items包含什么?它是包含视图中所有文本字段的数组吗?
没什么。你真的应该看看你的日志文件,看看params散列里面有什么。
:modality_items是一个嵌套在params:modality中的数组,因此您可以获得
params[:modality][:modality_items]因此,form_for(@modality)为您提供了params:modality,然后f.fields_for (注意从form_for传入的f)安排将fields_for参数作为一个数组嵌套在modality散列中
将使用表单中的数据更新@items,还是必须保存params:modality_items?
如果您在modality_items_attributes的医疗模型中使用accepts_nested_attributes_for :modality_items,并且这些属性是可访问的(不受批量分配保护),则您的行将根据需要自动更新或插入。基本上,accepts_nested_attributes_for接受嵌套在params散列中的与相同名称相对应的属性。
此官方文档中的链接清楚地说明了如何组织参数散列http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
有关fields_for http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for的更多详细信息,请阅读此处
https://stackoverflow.com/questions/15642831
复制相似问题