2013-09-11 5 views
0

У меня очень неприятная проблема. Вот поток:Нет совпадений в маршруте [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» на форме, которая уже существовала, когда я вошел на страницу, вот что вы видите формы данных:

enter image description here

Этот вызов возвращает 200 успех.

Если же я ударил тест обновления на форме, которая была добавлена ​​динамически через JS с описанным выше способом, показывает:

enter image description here

И что один терпит неудачу с 404 не найден.

Почему форма не используется _patch во втором случае? This answer говорит, что если объект сохраняется, форма должна использовать PUT, и я подтвердил в своей консоли rails, что объект фактически сохраняется.

ответ

0

Вы проверили файл своих маршрутов, чтобы убедиться, что он настроен правильно? Вот как я настраиваю такие элементы.

resources :projects do 
    resources :tests 
end 
+0

Да, у меня это уже есть. – Snowman

+0

@maq Что такое выход «рейковых маршрутов»? Я не думаю, что имеет какое-либо отношение к тому, существуют ли записи. –

+0

@PeterAlfvin помните, что я могу делать POST-запросы на этот URL-адрес, и он работает обычно при обновлении страницы, но когда объект является новым и форма динамически вставляется с помощью Javascript, происходит что-то теневое. – Snowman

0

http verb для обновления будет PUT. не POST.

это AutoGenerate маршрут для пользователя ресурса

POST /users(.:format)           users#create 

PUT /users/:id(.:format)          users#update 

ли рейк маршруты | GREP тесты и посмотреть, если есть маршрут, как показано ниже

POST /projects/:project_id/tests/:id тесты # обновление

Вы не нашли бы его, если вы не добавлять его в качестве пользовательского маршрута.

Чтобы исправить это, явным образом задайте метод, указанный в форме обновления. Или напишите свою форму здесь.

+0

См. Обновление к вопросу. Это существует. – Snowman

+0

Нет, нет. 'POST/projects /: project_id/tests (.: Format)' не так же, как 'POST/projects /: project_id/tests /: id (.: Format)'. ваша ошибка имеет URL с идентификатором test в нем – usha

+0

Не понимаю. Итак, вы говорите, что кнопка «Обновить тест» вызывает POST, а не PUT? – Snowman

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