我有一些看起来像这样的路线:
match 'hotels/:action(/:id)', :controller => 'hotel', :action => /[a-z]+/i, :id => /[0-9]+/i
我想在我的代码中某处使用类似 hotels_dislike_path 的内容,这些内容涉及/ hotels / dislike
我该怎么做?
答案 0 :(得分:19)
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
进行更多不常见的操作。
答案 1 :(得分:14)
自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
请注意,这是一个rails前缀而不是后缀操作 - dislike_hotel_path
而不是hotels_dislike
。