Как назвать маршрут в рельсах
У меня есть несколько маршрутов, которые выглядят следующим образом:
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
.