У меня очень неприятная проблема. Вот поток:Нет совпадений в маршруте [POST] после отправки формы
У меня есть модель проекта и модельный тест. В проекте много тестов.
В show
странице проекта, я нажимаю кнопку «Добавить тест» с этим:
<%= link_to "Add test", new_project_test_path, :remote => true %>
Это вызывает метод new
в моем tests_controller
:
def new
@project = Project.find(params[:project_id])
@test = Test.new
end
Поскольку это удаленный вызов , это позвонит затем new.js.erb
, который имеет:
$("#tests_table").append("<%= escape_javascript(render 'form', test: @test, project: @project) %>")
Это отображает форму, _form.html.erb, который начинается с:
<%= form_for([@project, test], :remote => true) do |f| %>
После заполнения формы, я ударил кнопку отправки ("Create Test"), который вызывает метод create
:
def create
@project = Project.find(params[:project_id])
@test = @project.tests.create(test_params)
end
end
Поскольку форма является удаленным, это будет вызывать create.js.erb
после завершения, который имеет:
$("#tests_table").append("<%= escape_javascript(render 'test', test: @test, project: @project) %>");
Это добавляет содержимое _test.erb.html
:
<%= render "tests/form", test: test, project: @project %>
Тест строка всегда находится в состоянии редактируемого, из-за чего _test частичного переходит к снова отобразить форму.
Теперь новая строка вставлена с правильными значениями, а кнопка отправки сообщает «Обновить тест».
Однако, когда я ударил тест обновления на этой новой вставленной форме, она не проходит, а консоль Javascript показывает, что запрос POST не удалось: не
Нет маршрута матчей [POST] "/projects/5230920870dbf2ba260000e8/tests/5230ae3970dbf2ec30000239 "
Как это может быть? Новый тестовый объект с этим ID существует, и это факт 100%. Я могу получить его в консоли rails. Если я обновляю страницу, а затем нажмите Update Test, она пройдет. Но только когда я снова вставляю строку через Javascript и нажимаю Update Test, она не проходит. Вы видите что-нибудь вообще здесь, которое выглядит теневым?
Мои routes.rb
имеет:
resources :projects do
resources :tests
end
Имейте в виду, что я могу сделать запросы POST к этому URL, и он работает на полной перезагрузки страницы, но когда объект является новым и форма вставляется динамически с помощью Javascript , что-то теневое происходит.
Соответствующие рейк маршруты выход:
project_tests GET /projects/:project_id/tests(.:format) tests#index
POST /projects/:project_id/tests(.:format) tests#create
new_project_test GET /projects/:project_id/tests/new(.:format) tests#new
edit_project_test GET /projects/:project_id/tests/:id/edit(.:format) tests#edit
project_test GET /projects/:project_id/tests/:id(.:format) tests#show
PATCH /projects/:project_id/tests/:id(.:format) tests#update
PUT /projects/:project_id/tests/:id(.:format) tests#update
DELETE /projects/:project_id/tests/:id(.:format) tests#destroy
Обновленный Подробнее
После проверки консоли JS немного больше, я нашел следующие детали.
Если я ударил «Test Update» на форме, которая уже существовала, когда я вошел на страницу, вот что вы видите формы данных:
Этот вызов возвращает 200 успех.
Если же я ударил тест обновления на форме, которая была добавлена динамически через JS с описанным выше способом, показывает:
И что один терпит неудачу с 404 не найден.
Почему форма не используется _patch во втором случае? This answer говорит, что если объект сохраняется, форма должна использовать PUT, и я подтвердил в своей консоли rails, что объект фактически сохраняется.
Да, у меня это уже есть. – Snowman
@maq Что такое выход «рейковых маршрутов»? Я не думаю, что имеет какое-либо отношение к тому, существуют ли записи. –
@PeterAlfvin помните, что я могу делать POST-запросы на этот URL-адрес, и он работает обычно при обновлении страницы, но когда объект является новым и форма динамически вставляется с помощью Javascript, происходит что-то теневое. – Snowman