2012-12-30 53 views
0

我有一个多模型的形式,我似乎无法捕捉有关嵌套模型的错误。这是Project-> Team-> Roles-> Role_skill_relationship形式的层次结构。我能够捕获与项目模型实例@project有关的错误,但是我未能捕获与角色和技能模型相关的验证。错误直接返回到浏览器页面,而不是重定向并闪烁到屏幕上。一个错误的一个例子,如果我故意填写表格的作用部分错误地是错误处理多模型形式

在角色#创建

显示 ÇNoMethodError:/用户/ Dstile /文档/ GitHub的/ creunity_app /应用程序/视图/技能/ _form.html.erb 其中线#8提出:

未定义的方法`地图”的零:NilClass提取的源(围绕线#8)

7:<%= skill_form.label:技能%>
8:<%= skill_form.collection_select:skill_id也,@skills,:ID,:姓名,:提示=> “选择>技能” %>

下面是代码的一部分

<%= 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

看来@skills尚未设置。 #collection_select在传入的集合上运行#map(在这种情况下为@skills),如果集合为nil(这是未定义的实例变量的默认值),将显示该错误。

记住的是,在验证错误的情况下,在你的控制器#create方法仅仅是渲染一个模板 - 它运行该模板对应的操作方法。因此,如果您在#new操作中定义了@skills操作,那么您还需要在#create操作中定义它(或更好地在before_filter中)。

+0

这样做。谢谢!我没有意识到,因为当我从下拉列表中选择数值时,它不会在#create方法中抛出映射错误。 – user1906851