Rails 4 wprowadził żądania PATCH
, aby być domyślną metodą żądania podczas wykonywania (wspólnej) częściowej aktualizacji obiektów. To konformalna standardów HTTP i dobre (starszych) po omówieniu tej decyzji można znaleźć tutaj:Czy można wyłączyć standardową trasę PUT w Railsach 4?
http://weblog.rubyonrails.org/2012/2/25/edge-rails-patch-is-the-new-primary-http-method-for-updates/
Podczas definiowania zasobów w config/routes.rb
jak
resources :books
następnie następujące trasy są utworzono domyślnie w szynach 4:
GET /books books#index
GET /books/:id books#show
POST /books books#create
DELETE /books/:id books#destroy
PATCH /books/:id books#update
PUT /books/:id books#update
Ponieważ opracowuję nową aplikację i nie muszę dbając o kompatybilność wsteczną, chciałbym usunąć przestarzałą trasę PUT
.
Czy istnieje prosty sposób osiągnięcia tego w config/routes.rb
?
Wyjaśnienie, dlaczego ta PUT
trasa denerwuje mnie: Używam swagger-docs gem do automatycznego generowania dokumentacji Swagger dla mojego API. Z powodu opisanego zachowania zawsze mam dwie definicje punktów końcowych dla żądań aktualizacji (PUT
i PATCH
) dla każdego zasobu. Dodatkowo, ponieważ jest to potencjalnie przestarzała trasa, chciałbym, aby moje API nie obsługiwało tego od dzisiaj.
UPDATE z powodu pierwszych odpowiedziach zmierza w złym kierunku, chciałbym wyjaśnić: Nie chcę, aby usunąć „aktualizacji” działania, ale tylko przestarzałe trasa PUT zachowując trasę Patch.
Dzięki za odpowiedź. Użycie except:: update usunie obie trasy PUT i PATCH, co nie jest tym, czego chcę. Jeśli chodzi o twoje wyjaśnienie różnic: to prawda, ale wpis na blogu, który podłączyłem w pytaniu wyjaśnia w przyzwoity sposób, że zasadniczo nigdy nie wykonujemy prawdziwych żądań PUT w naszych API. Rzadko zamieniasz całe obiekty (np. Created_at), a także update-or-create nie ma sensu w wielu interfejsach API, ponieważ identyfikator jest zwykle tworzony przez bazę danych, a nie przez klienta API, więc musisz utworzyć przez POST –
Rozumiem to, ale masz być świadomym, że: 1) Nie wszystkie serwery akceptują poprawki, jak wyjaśniono w moim poście na blogu 2) W interfejsie API akcja aktualizacji żądania nie wie, czy zaktualizowany obiekt istnieje, czy istnieje jakiś rodzaj: nie znaleziono błędu jednostki . Albo okaże się, że odnawiasz coś nieistniejącego. 3) Wszystkie akcje PUT przekierują do nieistniejącej trasy. Edytowanie za pomocą rodzaju rozwiązania. – tebayoso
Widzę punkt, w którym nie wszystkie serwery akceptują PATCH, ale nie odgrywają roli dla mojej aplikacji. Nie rozumiem jednak twojego drugiego punktu. oczywiście akcja aktualizacji sprawdzi, czy istnieje element, do którego istnieje odwołanie, i w przeciwnym razie wygeneruje błąd. Jaka jest różnica między oczekiwanym zachowaniem PUT i PATCH tutaj? Twój trzeci punkt jest dobry, ponieważ: Chcę, aby mój interfejs API ** nie ** definiował trasę PUT, tak aby konsumenci nie implementowali go. Po to tu jestem.Również powyższy link wyjaśnia, że utrzymywały one tylko trasę PUT dla kompatybilności wstecznej. –