Ruby on rails 在Rails中创建嵌套资源时没有路由匹配

Ruby on rails 在Rails中创建嵌套资源时没有路由匹配,ruby-on-rails,ruby,ruby-on-rails-4,ruby-on-rails-3.2,nested-attributes,Ruby On Rails,Ruby,Ruby On Rails 4,Ruby On Rails 3.2,Nested Attributes,我试图在我的项目中为特定学校创建一名新教师,但出现以下错误: 没有路线匹配[张贴]“/schools/3/teachers/new” 这是我的老师_controller.rb: class TeachersController < ApplicationController def new @teacher = Teacher.new end def create @teacher = Teacher.new(teacher_params) @teac

我试图在我的项目中为特定学校创建一名新教师,但出现以下错误:

没有路线匹配[张贴]“/schools/3/teachers/new”

这是我的老师_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
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
和教师/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 %>





在您的表单中尝试以下操作:

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

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

尝试将
teachers\u 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 %>

. . .
. . .

我相信这是一个有很多属于协会的组织。因此,您需要首先更改教师控制器“创建动作”和“新建动作”

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


希望这将有助于

当您呈现创建教师的
页面时,是否会出现此错误?目前,我可以查看表单并填写教师信息:名字、姓氏和中间名。然后,出现了错误。您能从
school\u teachers\u path(school)
中的
school
变量来自哪里吗?@Islam,谢谢您的帮助。但是,现在我得到了这个错误:没有路由匹配{:action=>“index”,:controller=>“teachers”,:school\u id=>nil}缺少必需的键:[:school\u id]将
school\u id
添加到控制器中:
params.require(:teacher).permit(:firstName,:lastName,:middleName,:school\u id)
。但是,我仍然想知道为什么它试图路由到索引操作!路线需要一个
学校id
作为密钥。我看不出你的答案在哪里通过。我试着像你说的那样添加学校id,但仍然得到相同的错误。我不知道它为什么试图路由索引操作,因为我认为它应该是我表单的创建操作。很抱歉,我正在学习Rails。好的,我将列:school_id(type:integer)添加到我的教师表中,现在可以使用了。但是,我需要为创建操作编辑行redirect_to school_path(params[:school_id])。否则,它将显示错误:未定义的局部变量或#的“school”方法。谢谢您的帮助,Ayoub先生。我正在学习Rails,我肯定会在这个网站上问更多关于Rails的问题。希望像您这样有经验的Rails程序员将来能帮助我。祝你有美好的一天。
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| %>