如何在rails中命名路由

时间:2011-10-27 08:57:33

标签: ruby-on-rails ruby

我有一些看起来像这样的路线:

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

我想在我的代码中某处使用类似 hotels_dislike_path 的内容,这些内容涉及/ hotels / dislike

我该怎么做?

2 个答案:

答案 0 :(得分:19)

来自routing guide

  

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