[英]No route matches while creating nested resource in Rails
我正在嘗試為我的項目中的特定學校創建一個新老師,我收到了這個錯誤:
沒有路線匹配[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 %>
由於您的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 %>
我相信這是一個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| %>
希望這會有所幫助
在您的表單中嘗試此操作:
<%= form_for [school, Teacher.new] do |f| %>
您要發布的路徑是針對學校教師的索引:
school_teachers GET /schools/:school_id/teachers(.:format) teachers#index
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.