#ruby-on-rails #ruby
#ruby-on-rails #рубиновый
Вопрос:
У меня есть несколько маршрутов, которые выглядят так :
match 'hotels/:action(/:id)', :controller => 'hotel', :action => /[a-z] /i, :id => /[0-9] /i
И я хочу использовать что-то вроде hotels_dislike_path где-нибудь в моем коде, который ссылается на /hotels/dislike
Как я могу это сделать?
Комментарии:
1. вы хотите назвать маршруты в соответствии с регулярным выражением? Не думайте, что это возможно, потому что если бы это было так, то это привело бы к бесконечному количеству маршрутов. Если
as
вам нужны ответы, я бы восстановил свой ответ
Ответ №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:
Многое изменилось в мире Rails с 2011 года — вот как вы могли бы достичь той же цели в 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
Обратите внимание, что префиксы rails вместо постфиксов действия — dislike_hotel_path
нет hotels_dislike
.
Комментарии:
1. Я добавил обновленный ответ, так как этот вопрос имеет очень высокий рейтинг в поиске.