hol*_*den 6 routes ruby-on-rails url-routing custom-routes ruby-on-rails-3
我有一个模型Spaces,它有不同类型的地方......如酒吧,餐馆等.它有相同的列,相同,模型,控制器等没有花哨的STI,我只有一个字段叫Space_type我想要确定别名路线.
而不是 domain.com/spaces/12345它/bars/12345或/clubs/12345
目前我有:
resources :spaces do
collection do
get :update_availables
get :update_search
get :autocomplete
end
member do
post :publish
post :scrape
end
resources :photos do
collection do
put :sort
end
end
resources :reviews
end
Run Code Online (Sandbox Code Playgroud)
另外,有没有办法可以做到这一点,以便我随时使用space_url它可以找出使用哪一个?
路线不是直接与您的模型交互的方式.因此,只要您编写标准路线,就可以使事情顺利进行.例如,为了让/bars/12345与/clubs/12345您spaces_controller(或任何控制器的名称),你可以创建这样的路线:
scope :path => '/bars', :controller => :spaces do
get '/:id' => :show_bars, :as => 'bar'
end
scope :path => '/clubs', :controller => :spaces do
get '/:id' => :show_clubs, :as => 'clubs'
end
Run Code Online (Sandbox Code Playgroud)
# routes.rb
match "/:space_type/:id", :to => "spaces#show", :as => :space_type
# linking
link_to "My space", space_type_path(@space.space_type, @space.id)
Run Code Online (Sandbox Code Playgroud)
这将生成这个网址:/bars/123,/clubs/1...任何space_type你拥有的
看起来STI wold做的工作小清洁;)
UPD
您还可以添加约束以防止一些冲突:
match "/:space_type/:id", :to => "spaces#show", :as => :space_type, :constraints => { :space_type => /bars|clubs|hotels/ }
Run Code Online (Sandbox Code Playgroud)
是的 - 将这个溃败放在所有其他路线的底部是个好主意
您也可以将其包装为帮助程序(并重写默认值space_url):
module SpacesHelper
def mod_space_url(space, *attrs)
# I don't know if you need to pluralize your space_type: space.space_type.pluralize
space_type_url(space.space_type, space.id, attrs)
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8043 次 |
| 最近记录: |