0

マルチモデル フォームがあり、ネストされたモデルに関連するエラーをキャプチャできないようです。これは、Project->Team->Roles->Role_skill_relationship という形式の階層です。プロジェクト モデル インスタンス @project に関連するエラーをキャプチャできますが、Role および Skills モデルに関連する検証をキャプチャできませんでした。エラーは、画面にリダイレクトしてフラッシュするのではなく、ブラウザ ページに直接返されます。フォームのロール部分を意図的に間違って記入した場合のエラーの一例は次のとおりです。

Roles#create の NoMethodError

C:/Users/Dstile/Documents/GitHub/creunity_app/app/views/skills/_form.html.erb を表示すると、8 行目が発生します。

nil:NilClass の undefined メソッド `map' 抽出されたソース (8 行目あたり)

7: <%= skill_form.label :skill %>
8: <%= skill_form.collection_select :skill_id, @skills, :id, :name, :prompt => "Select a > skill" %>

ここにコードの一部があります

<%= 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 にある可能性がありますが、このプロセスは中断されています。

4

1 に答える 1

0

設定されていないよう@skillsです。渡されたコレクション (この場合) で#collection_select実行され、コレクションが(未定義のインスタンス変数の既定値) である場合、そのエラーが表示されます。#map@skillsnil

検証エラーの場合、#createコントローラーのメソッドは単にテンプレートをレンダリングするだけであり、そのテンプレートに対応するアクション メソッドを実行しないことに注意してください。したがって、アクションで定義@skillsしている場合は、#newアクションでも定義する必要があります#create(または、より良いのは でbefore_filter)。

于 2012-12-30T05:47:52.227 に答える