Как назвать маршрут в рельсах

У меня есть несколько маршрутов, которые выглядят следующим образом:

match 'hotels/:action(/:id)', :controller => 'hotel', :action => /[a-z]+/i, :id => /[0-9]+/i

И я хочу использовать что-то вроде hotel_dislike_path где-то в моем коде, который ссылается на /hotels/dislike

Как я могу это сделать?

Ответ 1

В руководство по маршрутизации:

3.6 Именование маршрутов

Вы можете указать имя для любого маршрута, используя опцию: as.

match 'exit' => 'sessions#destroy', :as => :logout

Итак, в вашем случае это будет:

match 'hotels/:action(/:id)', :controller => 'hotel', :action => /[a-z]+/i, :id => /[0-9]+/i
match 'hotels/dislike(/:id)', :controller => 'hotel', :id => /[0-9]+/i, :as => :hotels_dislike
match 'hotels/like(/:id)', :controller => 'hotel', :id => /[0-9]+/i, :as => :hotels_like

Я не думаю, что есть способ сделать это динамически (так что вы должны определить один маршрут для каждого действия, в основном). Однако вы можете просто определить несколько маршрутов (например, выше) для наиболее часто используемых действий и просто использовать hotels_path :action => :really_like для более необычных действий.

Ответ 2

С 2011 года в мире Rails многое изменилось - так вы достигнете той же цели в Rails 4.

resources :hotels do
  member do
    post 'dislike'
    post 'like'
  end
end

Результирующие маршруты:

   dislike_hotel POST     /hotels/:id/dislike(.:format)   hotels#dislike
      like_hotel POST     /hotels/:id/like(.:format)      hotels#like
          hotels GET      /hotels(.:format)               hotels#index
                 POST     /hotels(.:format)               hotels#create
       new_hotel GET      /hotels/new(.:format)           hotels#new
      edit_hotel GET      /hotels/:id/edit(.:format)      hotels#edit
           hotel GET      /hotels/:id(.:format)           hotels#show
                 PATCH    /hotels/:id(.:format)           hotels#update
                 PUT      /hotels/:id(.:format)           hotels#update
                 DELETE   /hotels/:id(.:format)           hotels#destro

Обратите внимание, что prefixs rails вместо postfixes - dislike_hotel_path not hotels_dislike.