6

我有一个模型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

另外,有没有一种方法可以做到这一点,以便在我使用 space_url 的任何时候它都可以确定要使用哪一个?

4

2 回答 2

6

路由不是直接与模型交互的方式。所以,只要你写一个标准的路线,你就可以让事情顺利进行。例如,要为您的(或任何控制器的名称)制作/bars/12345和制作,您可以创建如下路由:/clubs/12345spaces_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  
于 2011-04-15T09:35:54.617 回答
5
# 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)

这将生成这个网址:/bars/123/clubs/1...任何space_type你有

看起来 STI 会做这项工作更干净;)

UPD

您还可以添加约束以防止某些冲突:

match "/:space_type/:id", :to => "spaces#show", :as => :space_type, :constraints => { :space_type => /bars|clubs|hotels/ }

是的 - 将这条路线放在所有其他路线的底部是个好主意

您还可以将其包装为助手(并重写您的默认值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
于 2011-04-15T09:36:16.623 回答