Обновление
Это унаследованное приложение, которое я унаследовал, и обнаружил, что предыдущие разработчики удалили код стойки, который преобразовывал запросы 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