我有一个多模型表单,我似乎无法捕获与嵌套模型相关的错误。这是表单Project-> Team-> Roles-> Role_skill_relationship的层次结构。我能够捕获与项目模型实例@project相关的错误,但是我没有成功捕获与角色和技能模型相关的验证。错误直接在浏览器页面中返回,而不是重定向和闪烁到屏幕。如果我故意错误地填写表单的角色部分,则会出现错误的一个示例
角色#create中的NoMethodError
显示 C:/Users/Dstile/Documents/GitHub/creunity_app/app/views/skills/_form.html.erb 第8行引出的地方:
nil的未定义方法`map':NilClass提取的源(第8行左右)
7:<%= skill_form.label:skill%>
8:<%= skill_form.collection_select:skill_id,@ skills,:id,:name,:prompt => “选择>技能”%>
以下是代码的一部分
<%= render 'shared/project_error_messages' %>
<%= project_form.label :title %>
<%= project_form.text_field :title %>
<%= project_form.label :category, "Category" %>
<%= project_form.select(:category, Project::CATEGORY_TYPES) %>
<%= project_form.label :description %>
<%= project_form.text_area :description %>
<%= project_form.label :goal_1, "Goal 1:" %>
<%= project_form.text_field :goal_1 %>
<h2>Your Team</h2>
<%= project_form.fields_for :team do |f| %>
<%= render 'teams/form', :team_form => f %>
<% end %>`
这是错误呈现代码
'<% if @project.errors.any? %>
<div id="error_explanation">
<div class="alert alert-error">
The form contains <%= pluralize(@project.errors.count, "error") %>.
</div>
<ul>
<% @project.errors.full_messages.each do |msg| %>
<li>* <%= msg %></li>
<% end %>
</ul>
</div>
<% end %>'
角色表单嵌套在团队表单中,就像团队嵌套在项目中一样。在我读过的所有其他主题中,我理解的是项目及其所有子模型(团队,角色,role_skill_relationships)的错误应该由@parent对象捕获。
是否存在我错过的配置设置或代码段,应该强制浏览器忽略错误?我的想法是错误可能在@project中,但是这个过程被中断了。
答案 0 :(得分:0)
似乎尚未设置@skills
。 #collection_select
在传入的集合(本例中为#map
)上运行@skills
,如果集合为nil
(这是undefined的默认值),则会显示该错误实例变量)。
请记住,在验证错误的情况下,控制器中的#create
方法只是呈现模板 - 它不运行该模板的相应操作方法。因此,如果您在@skills
操作中定义#new
,那么您还需要在#create
操作中定义它(或者,更好的是,在before_filter
中)。