1

Я пытаюсь создать новый учитель для конкретной школы в моем проекте, и я получил эту ошибку:Нет маршрут не соответствует при создании вложенного ресурса в Rails

No route matches [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 %> 
+0

Вы получаете эту ошибку, когда вы визуализацию 'new' страницы для создания учителя? –

+0

В настоящее время я вижу форму и заполняю информацию для учителя: Имя, фамилия и имя. Затем возникает ошибка. – NeverGiveUp1989

+0

Можете ли вы сказать, откуда появилась переменная 'school' в' school_teachers_path (school)? – Pavan

ответ

2

Как ваш teacher ресурс вложен под school ресурс, поэтому вам нужно пройти школу, когда вы пытаетесь создать учителя.

Попробуйте изменить new и create действия в teachers_controller.rb на что-то вроде этого:

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

@ Ислам, спасибо вам за помощь. Но теперь я получаю эту ошибку: Нет совпадений маршрутов {: action => "index",: controller => "teachers",: school_id => nil} missing required keys: [: school_id] – NeverGiveUp1989

+0

Добавьте 'school_id' в это в вашем контроллере: 'params.require (: teacher) .permit (: firstName,: lastName,: middleName,: school_id)'. Но, тем не менее, мне интересно, почему он пытается перейти к действию индекса! –

+0

Маршрут ожидает 'school_id' как ** key **. Я не вижу, где вы передаете его в своем ответе. – Pavan

0

Попробуйте это в форме:

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

Путь, который вы отправляете в для индекса учителей в школе :

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

Спасибо за ваше предложение. Хорошего дня, мистер Дэвизе. – NeverGiveUp1989

1

Я считаю, что это 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| %> 

Надеется, что это поможет

+0

Благодарю вас за помощь, мистер Айуб. Я изучаю Rails, и определенно я задам больше вопросов о Rails на этом сайте. Надеюсь, опытные программисты Rails, подобные вам, помогут мне в будущем. Хорошего дня. – NeverGiveUp1989

Смежные вопросы