【问题标题】:Ruby on Rails 3.2.13 - How Do I Reference Fields in fields_for?Ruby on Rails 3.2.13 - 如何引用 fields_for 中的字段?
【发布时间】:2013-03-26 16:51:17
【问题描述】:

我有一个带有相关模型 ModalityItem 的 Modality 模型。 Modality 有很多 :modality_items 和 ModalityItem 属于 :modality。我要显示的字段之一是 MediaLibrary 中的名称字段,其中 id 与 ModalityItem 中的 media_library_id 匹配。

我计划为每个 Modality 最多允许 15 ModalityItem 行。当需要添加新记录时,Rails 应用程序将为 ModalityItem 显示空白行,或者在存在记录时显示 ModalityItem 行数据。

这是我在modalities_controller 的编辑方法中的代码,我还可以在其中重命名Modality。我创建了数组 @items (Array.new(15)) 并使用 ModalityItem 或 ModalityItem.new 中的一行加载每个数组元素。如果所选 Modality 不存在 ModalityItem 行,则整个数组将包含 ModalityItem.new 的 15 个元素。如果 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 与 collection_select 语句一起使用,在该语句中,我在数组的下拉列表中捕获了多个项目的 ID 号。我使用这些 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 off and on 进行了数月的在线搜索后,一直未能找到答案。

注意:我目前没有在我的视图中引用 MediaLibrary 中的名称,因为在继续之前我需要有关如何访问 fields_for 中的字段的更多信息。我也有 :name 在 Modality 和 MediaLibrary 模型中的问题。 Modality 中的名称是可更新的,但 MediaLibrary 的名称将仅显示在 fields_for 语句中。

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.2 form-for fields-for


    【解决方案1】:

    params[:modality_items] 包含什么?它是一个包含所有 视图中的文本字段?

    什么都没有。您真的应该查看您的日志文件以查看 params 哈希中的内容。

    :modality_items 是一个嵌套在 params[:modality] 中的数组,所以你得到

    params[:modality][:modality_items]
    

    所以form_for(@modality)gets 你 params[:modality] 然后 f.fields_for(注意从 form_for 管道输入的 f)安排 fields_for 参数作为数组嵌套在模态散列中

    @items 是否会使用表单中的数据进行更新,或者我是否必须这样做 保存参数[:modality_items]?

    如果您在 Modality 模型中为modality_items_attributes 使用accepts_nested_attributes_for :modality_items 并且这些属性是可访问的(不受大规模分配的保护,那么您的行将根据需要自动更新或插入。 基本上accepts_nested_attributes_for 接受嵌套在对应于相同名称的params 哈希内的属性。

    来自官方文档的这个链接清楚地解释了 params 哈希是如何组织的 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

    阅读此处了解有关 fields_for http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for 的更多详细信息

    【讨论】:

    • 我查看了日志,但没有单击任何内容来查看哈希 DUH。我在 Modality 中有 accept_nested_attributes_for :modality_items 但不知道将 :modality_items_attributes 添加到我的 attr_accessible 列表中。我查看了fields_for info,但解释哈希的第一个链接是我需要的。它不仅解释了哈希是如何工作的,而且将帮助我使用 :reject 进行错误检查。当我在视图中输入少于 15 条记录的数据时,我需要弄清楚我的错误检查是如何工作的。我会试试这个并发布我的结果。谢谢你的信息,jamesw。
    • 运行良好。我只需要为 Modality 中的 :reject_if 选项调整我的拒绝方法,这样如果他们只输入一个字段,我的模型中的错误检查就会起作用。 params 哈希的链接对我来说是缺失的链接。再次感谢!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2012-05-12
    • 2017-08-03
    相关资源
    最近更新 更多