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选项为任何路径指定名称.
Run Code Online (Sandbox Code Playgroud)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
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.