Маршрутизация Rails 5.1+: `resources` не работает, но явное определение маршрута делает - PullRequest
0 голосов
/ 26 декабря 2018

Обновление

Это унаследованное приложение, которое я унаследовал, и обнаружил, что предыдущие разработчики удалили код стойки, который преобразовывал запросы POST браузера в PUT / PATCH на основе _method параметр, который Rails добавляет к вашим формам.

# config/application.rb
# This is the line that caused the problem...
config.middleware.delete ::Rack::MethodOverride

Как только я удалил эту строку и перезапустил сервер, все заработало как положено.

Исходный вопрос

Когда я публикую форму Rails, используя стандарт resources в файле маршрутов, возникает ошибка route not found, когда я пытаюсь обновить существующую запись:

No route matches [POST] "/admin/lookups/record_types/1"

Модель имеет пространство имен как app/models/lookups/record_type.rb

# model file
module Lookups
  class RecordType < ApplicationRecord
    # ...
  end
end

# form in view file
<%= form_with model: @record_type, scope: :record_type, url: [:admin, @record_type], local: true do |form| %>
  <%= form.text_field :value %>
<% end %>

# Request being sent
POST admin/lookups/record_types/1
{ record_type: { _method: "patch", value: "value" } }

# in routes .rb
namespace :admin do
  namespace :lookups do
    # Does not work
    resources :record_types

    # Works when explicitly written out
    post "record_types/:id", controller: record_types, action: :update
  end
end

Когда я явно записываю запрос POST в файл routes.rb, он работает как положено.

Я знаю, чтоRails фактически является POSTing запросом и использует скрытый атрибут _method для сопоставления файла маршрутов.Однако что-то не преобразует этот запрос должным образом.

Это приложение, которое я унаследовал, и в какой-то момент это был исключительно JSON API (без прямого пользовательского интерфейса), поэтому мне интересно, было ли что-то удалено, чтопреобразовал параметр Rails _method в соответствующий контроллер?Я не знаю, что это будет, хотя.

Это вывод моего rake routes:

admin_lookups_record_types
GET /admin/lookups/record_types(.:format)   
  admin/lookups/record_types#index
POST /admin/lookups/record_types(.:format) 
    admin/lookups/record_types#create

new_admin_lookups_record_type
GET /admin/lookups/record_types/new(.:format)
    admin/lookups/record_types#new

edit_admin_lookups_record_type
GET /admin/lookups/record_types/:id/edit(.:format) 
    admin/lookups/record_types#edit

admin_lookups_record_type
GET /admin/lookups/record_types/:id(.:format) 
    admin/lookups/record_types#show
PATCH /admin/lookups/record_types/:id(.:format) 
    admin/lookups/record_types#update
PUT /admin/lookups/record_types/:id(.:format)
    admin/lookups/record_types#update
DELETE /admin/lookups/record_types/:id(.:format)
    admin/lookups/record_types#destroy

1 Ответ

0 голосов
/ 26 декабря 2018

Кажется, проблема в использовании аргумента scope для метода form_with.Если вы посмотрите на маршруты, вы заметите, что для маршрута к действию update используется PUT или PATCH, а для маршрута к действию create используется POST.

.документация модуля FormHelper гласит:

в хэше опций.Если глаголом не является GET или POST, которые изначально поддерживаются HTML-формами, для формы будет задано POST, а скрытый ввод _method будет содержать глагол, предназначенный для интерпретации сервером.

Но вложение специальной клавиши _method внутри record_type нарушает этот механизм.Действительно ли необходим объем?Я бы попробовал удалить его, без него все должно работать нормально.Правильный HTTP-глагол будет использоваться PUT или PATCH.Добавление дополнительного маршрута POST нарушает обычную структуру Rails без какой-либо реальной выгоды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...