rails路由别名

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它可以找出使用哪一个?

Spy*_*ros 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  
Run Code Online (Sandbox Code Playgroud)


fl0*_*00r 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)
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)

  • 您需要确保"/:space_type /:id"低于config/routes.rb中的其他顶级资源声明,以避免干扰.Rails总是可以路由自己,但是如果你在自定义匹配器下面声明一个"resources:waffles",有人可以导航到"/ waffles/1234"并将它作为华夫饼干类型路由到空间控制器. (2认同)