rails嵌套资源的路由和自定义路由

时间:2014-07-02 07:57:22

标签: ruby-on-rails ruby-on-rails-4 routes nested-routes custom-routes

对于几个项目,我需要一些东西来简化我的路由,以删除其中一条最重要的路由的控制器名称。在这种情况下版本,所以而不是

domain.com/editions/london/venues/the-venue

我们使用 - >

domain.com/london/venues/the-venue

我一直在使用这个公式进行路由:

  # MUST BE LAST
  resources :editions, path: '' do
    get 'set_session', on: :member
    resources :events
    resources :quiz_masters
    resources :venues
  end

它运作良好,但我觉得有些不愉快。我想知道是否有更好的选择,也有限制,所以我不必担心它总是在我的路线底部。

我也不确定path: ''是一个很好的方法吗?即使它有效。

3 个答案:

答案 0 :(得分:3)

<强>路线

如果您的答案失效,我会详细说明我们是如何做到这一点的,也就是说我们的行为与您在问题中所解释的完全相同:

#config/routes.rb
... @bottom
resources :events, path: "" do
   resources :venues
   # ...
end

这仅适用于单个资源(您不能有多个path: ''),因为如果您有多个引用,它将会发生冲突。正如您所提到的,这应该位于路线的底部(甚至低于root)。我们目前使用此设置


App-Wide Slugs

您可能从中受益的是创建一些方法来处理应用程序范围的slugs

我们没有这样做,但理论上可以通过使用某种具有多态关联的中间件/简单模型来确定在哪里路由请求。

例如,根据引用的问题,您可以拥有如下模型:

#app/models/slug.rb
Class Slug < ActiveRecord::Base
   belongs_to :sluggable, polymorphic: true
end

#slugs table
id | sluggable_id | sluggable_type | created_at | updated_at

然后你可以像这样处理模型的slu ::

#app/models/concerns/slugged.rb
Class Slugged
    extend ActiveSupport::Concern

    included do
       has_one :slug, as: :sluggable
       before_save :build_slug
    end
end

这应该允许您在某些slug中间件中获取slug,并路由到正确的控制器。可能是“黑客”,但它是最广泛的&amp;模块化方式

答案 1 :(得分:3)

使用您的示例,您可能应该限制它。使用您包含的Edition.all.map(&amp; slug)数组,或者以某种方式缓存它,具体取决于列表的大小。这样它就会受到限制,并且不一定需要位于路径文件的底部。

resources :editions, path: '', :constraints => proc { |req| ['london', 'other_cities'].include?(req.params[:edition_id]) } do
  get 'set_session', on: :member
  resources :events
  resources :quiz_masters
  resources :venues
end

答案 2 :(得分:0)

在我看来,尴尬来自路线和网址的需求和线性特征,而不是来自您的解决方案。关于那段代码的东西(和Rich一样)感觉有点不愉快,正如你所说,也许&#34;不是Rails方式&#34 ;;但Rails必须在必要时进行弯曲,我无法想出一种更有效的方法来完成你正在做的事情。

如果路线中的第一个术语是slug(&#34; / london /&#34;),则必须最后定义路线。我无法想象任何方式,并且不要认为你应该失去任何睡眠或安心寻找替代方案。

任何有趣的应用程序都会突破它所编写的框架的限制,这意味着总会有一些尴尬的代码。