【问题标题】:rails routing aliasesrails 路由别名
【发布时间】:2011-08-06 04:34:56
【问题描述】:

我有一个名为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 的任何时候它都可以确定要使用哪个?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 routes url-routing custom-routes


    【解决方案1】:

    路由不是直接与模型交互的方式。所以,只要你写一个标准的路线,你就可以让事情顺利进行。例如,要将 /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  
    

    【讨论】:

      【解决方案2】:
      # 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
      

      【讨论】:

      • 不会 "/:space_type/:id", :to => "spaces#show", :as => :space_type 干扰我所有与空间无关的控制器吗?跨度>
      • 不,不会的。关于 STI、链接和路由查看:stackoverflow.com/questions/5246767/sti-one-controller/…
      • 您需要确保“/:space_type/:id”低于 config/routes.rb 中的其他顶级资源声明,以免干扰。 Rails 总是可以自己路由,但如果您在自定义匹配器下方声明“resources :waffles”,则有人可以导航到“/waffles/1234”,它会将其作为 waffle 类型路由到空间控制器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多