Невозможно сопоставить REST-маршруты пользовательского метода с Ruby on Rails

Я новичок в Ruby-on-Rails, и мне трудно найти маршруты, соответствующие моему сервису API.

Я разработал свои собственные маршруты для ресурсов, следуя Google AIP-136.

Например, для следующих маршрутов

  • /books/{book_id}:doSomething
  • /books/{book_id}:doSomeOtherThing

В config/routes.rb я ожидал, что будет работать следующее:

post '/books/:id/\:doSomething', to: 'books#do_something_handler'
post '/books/:id/\:doSomeOtherThing', to: 'books#do_some_other_thing_handler'

Но это не работает. Я получаю ActionController::RoutingError (No route matches [POST] "/books/1234:doSomething"):

Я пробовал и другие вещи, но не получил очень удовлетворительного результата.

Может ли кто-нибудь помочь мне, как это сделать правильно.

С использованием -

  • Рельсы 7.1.3.4
  • рубин 3.3.4

🤔 А знаете ли вы, что...
Rails также используется в других известных проектах, таких как GitHub и Airbnb.


1
53
1

Ответ:

Решено

Использование ограничений:

# POST /books/1:doSomething
post "/books/:id::custom_method", 
  to: "books#do_something_handler",
  constraint: {custom_method: "doSomething"}

# POST /books/1:doSomethingElse
post "/books/:id::custom_method",
  to: "books#do_something_else",
  constraints: {custom_method: "doSomethingElse"}

Используя параметр action рельсов, в этом случае пользовательский метод должен соответствовать имени действия:

# POST /books/1:doSomething
# routes to `doSomething` controller action
post "/books/:id::action", controller: :books

Тестировать:

<%= form_with url: "books/1:doSomething" do |f| %>
  <%= f.submit %>
<% end %>

<%= form_with url: "books/1:doSomethingElse" do |f| %>
  <%= f.submit %>
<% end %>

маршрут с ограничениями:

Started POST "/books/1:doSomething" for 127.0.0.1 at 2024-07-26 15:36:50 -0400
Processing by BooksController#do_something as TURBO_STREAM
  Parameters: {"authenticity_token"=>"[FILTERED]", "commit"=>"Save ", "id"=>"1", "custom_method"=>"doSomething"}
Completed 200 OK in 3ms (ActiveRecord: 2.3ms | Allocations: 1332)


Started POST "/books/1:doSomethingElse" for 127.0.0.1 at 2024-07-26 15:36:52 -0400
Processing by BooksController#do_something_else as TURBO_STREAM
  Parameters: {"authenticity_token"=>"[FILTERED]", "commit"=>"Save ", "id"=>"1", "custom_method"=>"doSomethingElse"}
Completed 200 OK in 2ms (ActiveRecord: 0.1ms | Allocations: 892)

маршрут с параметром action:

Started POST "/books/1:doSomething" for 127.0.0.1 at 2024-07-26 15:11:22 -0400
Processing by BooksController#doSomething as TURBO_STREAM
  Parameters: {"authenticity_token"=>"[FILTERED]", "commit"=>"Save ", "id"=>"1"}
Completed 200 OK in 2ms (ActiveRecord: 0.1ms | Allocations: 1008)