【问题标题】:No route matches while creating nested resource in Rails在 Rails 中创建嵌套资源时没有路由匹配
【发布时间】:2015-11-16 05:29:51
【问题描述】:

我正在尝试为我的项目中的特定学校创建新教师,但出现此错误:

没有路线匹配 [POST] "/schools/3/teachers/new"

这是我的 Teachers_controller.rb:

class TeachersController < ApplicationController
  def new
    @teacher = Teacher.new
  end

  def create
    @teacher = Teacher.new(teacher_params)
    @teacher.save

    redirect_to school_path(school)
  end

  private

    def teacher_params
      params.require(:teacher).permit(:firstName, :lastName, :middleName)
    end
end

schools_controller.rb:

class SchoolsController < ApplicationController
  def show
    @school = School.find(params[:id])
  end

  def new
    @school = School.new
  end

  def edit
    @school = School.find(params[:id])
  end

  def update
    @school = School.find(params[:id])

    if @school.update(school_params)
      redirect_to @school
    else
      render 'edit'
    end
  end

  def index
    @schools = School.all
  end

  def create
    @school = School.new(school_params)

    if @school.save
      redirect_to schools_path
    else
      render 'new'
    end
  end

  def destroy
    @school = School.find(params[:id])
    @school.destroy

    redirect_to schools_path
  end

  private

    def school_params
      params.require(:school).permit(:name)
    end
end

routes.rb:

Rails.application.routes.draw do
  resources :schools do
    resources :teachers
  end

  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  root 'welcome#index'

还有教师/new.html.erb:

<%= form_for :teacher, url: school_teachers_path(school) do |f| %>
  <p>
    <%= f.label :firstName %><br>
    <%= f.text_field :firstName %>
  </p>

  <p>
    <%= f.label :lastName %><br>
    <%= f.text_field :lastName %>
  </p>

  <p>
    <%= f.label :middleName %><br>
    <%= f.text_field :middleName %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

【问题讨论】:

  • 在渲染new创建教师页面时是否出现此错误?
  • 目前,我可以看到表格并填写老师的信息:名字、姓氏和中间名。然后,错误出现了。
  • 你能知道school_teachers_path(school)中的school变量是从哪里来的吗?

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-3.2 nested-attributes


【解决方案1】:

由于您的teacher资源嵌套在school资源下,因此您在尝试创建教师时需要通过学校。

尝试将teachers_controller.rb 中的new 和create 操作更改为如下内容:

  def new
    @school = School.find(params[:school_id])
    @teacher = @school.teachers.build
  end

  def create
    @school = School.find(params[:school_id])
    @teacher = @school.teachers.build(params[:teacher])
    @teacher.save
    redirect_to school_path(@school)
  end

然后,将您的表单更改为:

<%= form_for([@school, @teacher]) do %>
. . .
. . .
<% end %>

【讨论】:

  • @Islam,谢谢你的帮助。但是,现在我得到了这个错误:没有路由匹配 {:action=>"index", :controller=>"teachers", :school_id=>nil} missing required keys: [:school_id]
  • 在你的控制器中添加school_id:params.require(:teacher).permit(:firstName, :lastName, :middleName, :school_id)。但是,我仍然想知道为什么它试图路由到索引操作!
  • 路由需要 school_id 作为 key。我看不到您在答案中传递它的位置。
  • 我尝试按照您所说的添加 school_id,但仍然遇到同样的错误。我不知道它为什么要尝试路由索引操作,因为我认为它应该是我的表单的创建操作。抱歉,我正在学习 Rails。
  • 好的,我在我的教师表中添加了列:school_id(type: integer),现在可以使用了。但是,我需要为 create 操作编辑行 redirect_to school_path(params[:school_id]) 。否则,它将向我显示错误:#<0x007fa922861190>
【解决方案2】:

在你的表单中试试这个:

<%= form_for [school, Teacher.new] do |f| %>

您发布到的路径是学校教师的索引:

school_teachers GET    /schools/:school_id/teachers(.:format)   teachers#index

【讨论】:

    【解决方案3】:

    我相信这是一个 has_many belongs_to 关联。所以你需要先改变你的教师控制器创建动作和新动作。

    class TeachersController < ApplicationController
     def new
      get_school
      @teacher = @school.teachers.build
     end
    
     def create
      get_school
      @teacher = @school.teachers.build(teacher_params)
      If @teacher.save
          redirect_to school_path(school)
      else
          render 'new'
      end
    
     private
    
      def teacher_params
        params.require(:teacher).permit(:firstName, :lastName, :middleName)
       end
     def get_school
         @school = School.find (params [:school_id])
     end
     end
    

    然后在你的表单中你会做:

      <%= form_for([@school,@teacher]) do |f| %>
    

    希望这会有所帮助

    【讨论】:

    • 感谢您的帮助,Ayoub 先生。我正在学习 Rails,我肯定会在这个网站上询问更多关于 Rails 的问题。希望像您这样有经验的 Rails 程序员将来能帮助我。祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多