我有一个Ruby on Rails 3.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'
以下是我如何定义与MediaTopic模型相关的MediaLibrary模型。我只包括与我的问题相关的模型部分。
class MediaLibrary < ActiveRecord::Base
attr_accessible :media_topics_attributes
has_many :media_topics, dependent: :destroy
accepts_nested_attributes_for :media_topics
class MediaTopic < ActiveRecord::Base
belongs_to :media_library
这是我的编辑方法:
def edit
@media_library = MediaLibrary.find(params[:id])
@edit_page = true
end
此语句是我从collect_select中为Topic模型获取所选media_topics的数组(其中media_topics获取与MediaLibrary模型相关的topic_id值)
@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
以下是我的编辑视图中的代码。 display_topics助手显示主题下拉列表上方的相关主题行列表。
<% 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>
这是display_topics助手:
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
我不知道使用nested_attributes的另一种方法,而不是手动添加或删除/重新添加它们。
我不知道的是,当我第二次渲染'edit'时,表单中的嵌套属性会发生什么?从我在这个错误中看到的情况看来,这似乎消失了,因此未定义的方法:topic_id。
自从我开发了这个函数以来,我已经做了很多搜索,但我没有看到提到的这个错误。我记得的所有示例都没有显示嵌套属性的情况,其中一个人背靠背地渲染编辑视图,首先显示记录然后显示错误。
如何将嵌套属性第二次返回到视图?
任何帮助都将不胜感激。
答案 0 :(得分:0)
我一直在做更多研究,并注意到在表单中使用 fields_for 时,它被指定为 f.fields_for ,而不是我在应用程序中使用的fields_for。我将视图更改为使用 f.fields_for ,并注意到所选选项出现在我的主题模型的下拉列表中。希望这将解决我在其他问题中遇到的问题。至少我不再得到500错误。我可能会重写我在控制器中更新MediaTopic行的代码,因为现在它在我的视图中使用了media_topic_attributes。