Как назвать маршрут в rails

#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. Я добавил обновленный ответ, так как этот вопрос имеет очень высокий рейтинг в поиске.