代码之家  ›  专栏  ›  技术社区  ›  Toontje

Rails 5.1应用程序中的嵌套路由问题

  •  0
  • Toontje  · 技术社区  · 8 年前

    我正在创建一个申请,让学生在考试期间登记缺勤。

    我的路线如下所示:

    resources :users do
      resources :absences
    end
    

    创建缺勤的表单如下所示:

    <%= form_for [@user, @absence] do |f| %>
      <%= f.label :course_id, "Vak" %>
      <%= f.select :course_id, options_for_courses, label: "Vak" %>
      <%= f.label :date, "Datum" %>
      <%= f.text_field :date %>
      <%= f.submit "Afwezigheid aanvragen" %>
    <% end %>
    

    缺席模型如下所示:

    class Absence < ApplicationRecord
      ...
      belongs_to :user
    end
    

    用户模型如下所示:

    class User < ApplicationRecord
      ...
      has_many :absences
    end
    

    class AbsencesController < ApplicationController
      ...
      def new
        @user = current_user
        @absence = current_user.absences.build
      end
    
      def create
        @absence = Absence.create(absence_params)
        if @absence.save
          redirect_to root_path, notice: "Afwezigheid succesvol aangevraagd"
        else
          flash[:alert] = "Er was een probleem met het registreren van de afwezigheid"
        render :new
      end
    end
    

    但是,当我试图登记缺勤时,我在表格中得到一个错误: 错误日志如下所示:

    Started POST "/users/2/absences" for 127.0.0.1 at 2017-09-21 09:51:55 +0200
    Processing by AbsencesController#create as HTML
      Parameters: {"utf8"=>"✓", "authenticity_token"=>"esW1HeKf+VG8+RC4Zm2F7d8BFewddk6aIssj0Y90s+UC4oTUxpO1iw9hR9M94Jfov5bjeB0aQPRHG0qvENO3Tg==", "absence"=>{"course_id"=>"2", "date"=>"27/09/2017"}, "commit"=>"Afwezigheid aanvragen", "user_id
    "=>"2"}
       (0.1ms)  BEGIN
      Course Load (0.3ms)  SELECT  "courses".* FROM "courses" WHERE "courses"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
       (0.1ms)  ROLLBACK
       (0.1ms)  BEGIN
       (0.1ms)  ROLLBACK
      Rendering absences/new.html.erb within layouts/application
      Rendered absences/new.html.erb within layouts/application (145.6ms)
    Completed 500 Internal Server Error in 616ms (ActiveRecord: 0.9ms)
    
    
    
    ActionView::Template::Error - undefined method `absences_path' for #<#<Class:0x007fb911af0420>:0x007fb90baab5d8>
    Did you mean?  asset_path:
      actionpack (5.1.3) lib/action_dispatch/routing/polymorphic_routes.rb:230:in `polymorphic_method'
      actionpack (5.1.3) lib/action_dispatch/routing/polymorphic_routes.rb:138:in `polymorphic_path'
      actionview (5.1.3) lib/action_view/helpers/form_helper.rb:472:in `apply_form_for_options!'
      actionview (5.1.3) lib/action_view/helpers/form_helper.rb:440:in `form_for'
    

    3 回复  |  直到 8 年前
        1
  •  1
  •   Deepesh elements    8 年前

    创建对象时出错,您正在执行 render :new 再次渲染表单,但使用 @user nil <%= form_for [nil, @absence] do |f| %> 使路径成为 absences_path @用户 current_user 处处这样地:

     def new
       @user = current_user # You may remove this
       @absence = current_user.absences.build
     end
    
     def create
       @absence = Absence.create(absence_params)
       if @absence.save
         redirect_to root_path, notice: "Afwezigheid succesvol aangevraagd"
       else
         @user = current_user # If you don't want to remove this line from new action then add it here too
         flash[:alert] = "Er was een probleem met het registreren van de afwezigheid"
         render :new
       end
     end
    

    form @用户 然后从控制器执行以下操作:

    <%= form_for [current_user, @absence] do |f| %>
    

    更新:

    将对象保存在 create 操作更改此行:

    @absence = Absence.create(absence_params)
    

    @absence = current_user.absences.build(absence_params)
    

    user_id 是零,因为没有输入框或任何隐藏字段,这是正确的。您只需要根据 . 我已经改变了 build 因为 创造 save

    希望这有帮助。

        2
  •  0
  •   Salil    8 年前

    你的大脑出现了问题 create 方法 new @user

    在创建方法中添加以下内容(&A);再次检查

    @user = current_user
    
        3
  •  -1
  •   Oscar Luza    8 年前

    redirect_to root_path, notice: "Afwezigheid succesvol aangevraagd"
    return
    

    或者删除create方法末尾的那一行

        render :new
    

    @absence = current_user.absences.build(absence_params)