如何在rails中命名路由

Seb*_*ien 19 ruby ruby-on-rails

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

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

我想在我的代码中的某个地方使用像hotels_dislike_path这样的东西,这些东西是/ hotels/dislike

我怎样才能做到这一点?

Fel*_*lix 19

路线指南:

3.6命名路由

您可以使用:as选项为任何路径指定名称.

match 'exit' => 'sessions#destroy', :as => :logout
Run Code Online (Sandbox Code Playgroud)

所以,在你的情况下,那将是:

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
Run Code Online (Sandbox Code Playgroud)

我认为没有办法动态地这样做(所以你必须为每个动作定义一个路线,基本上).但是,您可以为最常用的操作定义几个路由(如上所述),并仅hotels_path :action => :really_like用于更多不常见的操作.


max*_*max 16

自2011年以来,Rails世界发生了很多变化 - 这就是你如何在Rails 4中实现同样的目标.

resources :hotels do
  member do
    post 'dislike'
    post 'like'
  end
end
Run Code Online (Sandbox Code Playgroud)

结果路线:

   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
Run Code Online (Sandbox Code Playgroud)

请注意,这是rails的前缀,而不是后缀的操作 - dislike_hotel_path而不是hotels_dislike.

  • 我添加了一个更新的答案,因为这个问题的搜索排名非常高. (3认同)