对于几个项目,我需要一些东西来简化我的路由,以删除其中一条最重要的路由的控制器名称。在这种情况下版本,所以而不是
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: ''
是一个很好的方法吗?即使它有效。
答案 0 :(得分:3)
<强>路线强>
如果您的答案失效,我会详细说明我们是如何做到这一点的,也就是说我们的行为与您在问题中所解释的完全相同:
#config/routes.rb
... @bottom
resources :events, path: "" do
resources :venues
# ...
end
这仅适用于单个资源(您不能有多个path: ''
),因为如果您有多个引用,它将会发生冲突。正如您所提到的,这应该位于路线的底部(甚至低于root
)。我们目前使用此设置
您可能从中受益的是创建一些方法来处理应用程序范围的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;),则必须最后定义路线。我无法想象任何方式,并且不要认为你应该失去任何睡眠或安心寻找替代方案。
任何有趣的应用程序都会突破它所编写的框架的限制,这意味着总会有一些尴尬的代码。