Ruby on rails 在控制器中执行错误检查时访问嵌套属性

Ruby on rails 在控制器中执行错误检查时访问嵌套属性,ruby-on-rails,ruby-on-rails-3.2,nested-attributes,Ruby On Rails,Ruby On Rails 3.2,Nested Attributes,我有一个RubyonRails3.2.13应用程序,其中一个模型与多个模型相关。我将给出其中一个相关模型的信息来解释该场景。我在维护屏幕中使用了新视图和编辑视图。我对使用嵌套属性还是相当陌生的。我的维护屏幕允许维护具有相关属性的行。我手动获取所选行,并将它们写出与父行关联的行。我将它们显示在collection_select下拉列表框顶部的列表中。然而,在最近检查了500个错误后,我发现我有一些软件问题需要纠正 我在更新方法中有我的错误检查代码,我在找到错误后在该方法中渲染编辑。当它试图显示编辑

我有一个RubyonRails3.2.13应用程序,其中一个模型与多个模型相关。我将给出其中一个相关模型的信息来解释该场景。我在维护屏幕中使用了新视图和编辑视图。我对使用嵌套属性还是相当陌生的。我的维护屏幕允许维护具有相关属性的行。我手动获取所选行,并将它们写出与父行关联的行。我将它们显示在collection_select下拉列表框顶部的列表中。然而,在最近检查了500个错误后,我发现我有一些软件问题需要纠正

我在更新方法中有我的错误检查代码,我在找到错误后在该方法中渲染编辑。当它试图显示编辑视图时,我得到一个500错误,它试图找到我的一个嵌套属性的数组。这是我最近犯的一个错误

Completed 500 Internal Server Error in 24ms

ActionView::Template::Error (undefined method `topic_id' for {"topic_id"=>[""]}:ActiveSupport::HashWithIndifferentAccess):
    56:     <p style="padding-left: 150px; color: #f8ee5f;"><%= display_topics @media_library %></p>
    57: <% end %>
    58: <%= fields_for :media_topics do |media_topic| %>
    59:   <%= media_topic.label :topic, "Topics" %><%= media_topic.collection_select(:topic_id, Topic.order("name_en"), :id, :name_en, {}, {multiple: true}) %>
    60: <% end %><br>
    61: 
    62: <% if @media_library.media_targets.count > 0 %>
  app/views/media_libraries/_media_library_fields.html.erb:59:in `block in _app_views_media_libraries__media_library_fields_html_erb___4316101037373251257_70115028003400'
  app/views/media_libraries/_media_library_fields.html.erb:58:in `_app_views_media_libraries__media_library_fields_html_erb___4316101037373251257_70115028003400'
  app/views/media_libraries/edit.html.erb:7:in `block in _app_views_media_libraries_edit_html_erb__2448603971022600459_70115028733680'
  app/views/media_libraries/edit.html.erb:6:in `_app_views_media_libraries_edit_html_erb__2448603971022600459_70115028733680'
  app/controllers/media_libraries_controller.rb:115:in `update'
在此语句中,我从为主题模型选择的集合中获取所选媒体主题的数组(其中媒体主题获取其与媒体库模型相关的主题id值)

下面是update方法中的错误检查示例

case
when params[:link].blank?         && params[:link_video].blank? && params[:link_pdf].blank? && params[:resource].blank? && params[:resource2].blank? && params[:resource3].blank?
  flash.now[:error] = "You must enter at least one link before creating a Media Library Item."
  render 'edit'
else
  some update logic here
end
这是我的编辑视图中的代码。“显示主题”帮助器在主题下拉列表上方显示相关主题行的列表

<% if @media_library.media_topics.count > 0 %>
  <p style="padding-left: 150px; color: #f8ee5f;"><%= display_topics @media_library %></p>
<% end %>
<%= fields_for :media_topics do |media_topic| %>
  <%= media_topic.label :topic, "Topics" %><%= media_topic.collection_select(:topic_id, Topic.order("name_en"), :id, :name_en, {}, {multiple: true}) %>
<% end %><br>
除了手动添加或删除/重新添加嵌套的_属性之外,我不知道还有其他方法可以使用它们

我不知道的是,当我第二次呈现“编辑”时,表单中的嵌套属性会发生什么变化?从我在这个错误中看到的情况来看,它似乎消失了,因此出现了未定义的方法:topic_id

自从我开发这个函数以来,我做了很多断断续续的搜索,但是我没有看到这个错误。我记得的所有示例都没有显示具有嵌套属性的情况,其中一个人背靠背地呈现编辑视图,首先显示记录,然后显示错误

如何再次将嵌套属性返回到视图


任何帮助都将不胜感激。

我一直在做更多的研究,并注意到当使用字段作为的形式时,它被指定为f.fields\u作为,而不是我在应用程序中使用的字段。我将视图更改为对使用f.fields\u,并注意到所选选项显示在我的主题模型下拉列表中。希望这能解决我在另一个问题中遇到的问题。至少我不再得到500的错误。我可能会重写我在控制器中更新MediaTopic行的代码,因为现在它在我的视图中使用media_topic_属性。

我还没有通读您的整个问题,但我通常使用
检查空参数!params[:name]
-如果有帮助的话。问题可能与我如何处理媒体主题中的行有关。我使用一个人从中选择的主题模型手动添加/删除它们。空哈希/数组在此实例中有效。我需要弄清楚如何让它正确显示。要么这样,要么我可以用另一种方法来完成这个过程。我将提交与该问题相关的另一个问题,该问题可能会解决此问题,在尝试显示我的视图时,我不会有一个空哈希。
@media_topics  = params[:media_topics]
case
when params[:link].blank?         && params[:link_video].blank? && params[:link_pdf].blank? && params[:resource].blank? && params[:resource2].blank? && params[:resource3].blank?
  flash.now[:error] = "You must enter at least one link before creating a Media Library Item."
  render 'edit'
else
  some update logic here
end
<% if @media_library.media_topics.count > 0 %>
  <p style="padding-left: 150px; color: #f8ee5f;"><%= display_topics @media_library %></p>
<% end %>
<%= fields_for :media_topics do |media_topic| %>
  <%= media_topic.label :topic, "Topics" %><%= media_topic.collection_select(:topic_id, Topic.order("name_en"), :id, :name_en, {}, {multiple: true}) %>
<% end %><br>
  def display_topics(media_library)

    media_library_topics = MediaTopic.where("media_library_id = ?", media_library.id).all
    topic_list = nil;
    if media_library_topics
      i = 1
      media_library_topics.each do |mltopic|
        topic_row = Topic.find(mltopic.topic_id)
        case I18n.locale.to_s
        when "fr"
          topic_name = topic_row.name_fr
        when "pt"
          topic_name = topic_row.name_pt
        when "es"
          topic_name = topic_row.name_es
        else
          topic_name = topic_row.name_en
        end
        if i == 1
          if media_library_topics.size == 1 
            topic_list = "#{t :media_label_topic}: "+topic_name
          else
            topic_list = "#{t :media_label_topics}: "+topic_name
          end
        else  
          topic_list = topic_list+" | "+topic_name
        end
        i += 1
      end
      "#{topic_list}"
    end

  end