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

Ruby on rails 嵌套资源的rails路由和自定义路由,ruby-on-rails,ruby-on-rails-4,routes,nested-routes,custom-routes,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 resour

对于几个项目,我需要一些东西来简化我的路由,以删除其中一个最重要路由的控制器名称。在本例中,使用

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
它很好用,但我觉得有点不舒服。我想知道是否有更好的选择,一个也有限制的选择,所以我不必担心总是把它放在我的路线的底部


我也不确定路径:'是否是一个好方法?即使它可以工作。

路由

如果你的回答有误,我将详细说明我们是如何做到这一点的,也就是说,我们的做法与你在问题中解释的完全相同:

#config/routes.rb
... @bottom
resources :events, path: "" do
   resources :venues
   # ...
end
这仅适用于单个资源(您不能有多个
路径:“”
),因为如果您有多个引用,则会发生冲突。正如您所提到的,这应该放在路由的底部(甚至在
根目录下)。我们目前使用此设置


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

我们还没有做到这一点,但理论上可以通过使用某种中间件/具有多态关联的简单模型来确定将请求路由到何处来处理

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

#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

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

在我看来,尴尬来自于路由和URL的需求和线性性质,而不是您的解决方案。正如您所说,该代码(与Rich的代码相同)的某些地方让人感觉有点不舒服,可能“不是Rails的方式”;但铁轨应该在必要时弯曲,我想不出更有效的方法来完成你正在做的事情

如果路由中的第一个术语是slug(“/london/”),则必须在最后定义路由。我无法想象有什么办法可以解决这个问题,我也不认为你应该失去任何睡眠或平静的心情去寻找替代品


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

使用您的示例,您可能应该限制它。要么使用包含的Edition.all.map(&:slug)数组,要么根据列表的大小以某种方式缓存它。这样,它将受到限制,并且不一定需要位于routes文件的底部

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

例如,我可以用
:constraints=>proc{req|Edition.all.map(&:slug.include?(req.params[:Edition_id])}
?这也是我们一直在努力解决的问题-我们的最佳解决方案是您在问题中提出的,如果您有一个实例希望在自己的路由中不使用任何资源定义,只是感觉有点像黑客。一方面,我不喜欢用路径打开所有路由:“另一方面,我不喜欢在我的路由中设置一个必须接触DB的约束!肮脏!给你写答案。不会对你有多大帮助,但会解释一些事情
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