如何创建Rails应用程序范围内塞路由?(How to create app-wide slug r

2019-07-21 10:39发布

我公司拥有一批在Rails应用程序我正在不同的型号。 我已经看到了一些网站使用的应用程序范围内塞路由方法。 我是什么意思?

http://example.com/nick-oneill <-- This points to a User object
http://example.com/facebook    <-- This points to a Company object
http://example.com/developers  <-- This points to the users#index page

我知道to_param和应用程序中创建读者喜爱的蛞蝓,但我不知道的方法有root级别的蛞蝓为各种不同的物体。 你可以认为这是类似于Facebook的图形API的:有不同的对象类型,但它们都在存在https://graph.facebook.com/object-id

任何有识之士将不胜感激!

Answer 1:

有可能是一种方式与freindly_id做到这一点,但我认为,友好的ID的问题是事情都是由模型作用域。

如果我想忠实地站点范围猛击我将创建我的所有车型多态性关系的蛞蝓表。

Sluggable_type和sluggable_id,然后用完整的固定链接/塞一塞场。

+---------------------------------------------+
| sluggable_type | sluggable_id |     slug    |
|      user      |       13     |  users/john |
+---------------------------------------------+

现在,我可以做这样一个通配符捕获所有路线或在运行时创建了我所有的蛞蝓的路线和强制路由刷新当模型更新,这是该sluggable控制之下。

routes.rb

  get "/*segments",
               :controller => 'slugs',
               :action => 'dynamicroute'

现在,在您SlugsController实施等的方法

def dynamicroute
  segments = params[:segments]
  slugs.find_by_slug(segments)
  slug.sluggable_type.constantize.find(slug.sluggable_id) #retrive real record
  #some magic to handle the slugged item maybe redirect to the appropriate
  #controller or somehow call the show view for that controller
end

要么

routes.rb

begin  
  Slug.all.each do |s|
    begin
      get "#{s.slug}" => "#{s.sluggable_type.demodulize.pluralize.camelize}#show"
    rescue
    end
  end
rescue
end

如果使用第二个方法来路由确保你打电话

YOUR_APP_NAME::Application.reload_routes!

编辑后的任何猛击记录刷新路由表。

我们也有类似的问题,我们可以尝试我们的手在gemifying这种方法。



Answer 2:

我可能会接近这个如下,至少作为第一关:

  • 使用friendly_id或类似的生成涉及每个模型蛞蝓
  • 挂钩一个包罗万象的路线/([-_a-zA-Z0-9]+)并指向像EntitiesController#show
  • 挂钩的更高优先级的路由/developers指向Users#index
  • 在EntitiesController#显示:

    @entity = User.find(params[:id]) or Company.find(params[:id]) or raise ActionController::RoutingError.new('Not Found')

  • 然后,基于实体的类型你有:

    render "VIEW_PATH_BASED_ON_ENTITY_CLASS/show"

我也想订购的发现从最多到最少频繁访问(猜先,然后用数据以后调整的顺序)。

最后,可能很明显,但要确保你在每个表索引slug列,因为你经常会被每个请求做多的发现。

FWIW我很想知道一个更好的方式来处理这个问题,以及; 这简直就是如何我最初攻击的问题。



Answer 3:

我的第一反应是创建一个新的弹头模型。 这种模式将有一个多态的belongs_to

belongs_to :sluggable, :polymorphic => true

在这至少表将有:

  • value -或者比这一些更好的名字。 蛞蝓本身的价值。
  • sluggable_typesluggable_id -多态外键。

你的公司,用户等车型车型只会有一个毛坯:

has_one :slug

这给我们的蝙蝠几个优点:

  • 它现在容易使蛞蝓值的唯一约束。 如果塞被保留为所有不同型号sluggable的属性,你的唯一约束会检查所有的唯一其他sluggable表。 使一个糟糕的时间。
  • 路由是很简单的,因为你可以使用普通的resource路由到根级别命名空间。 你可能要保持它的低/ AT的高端路由文件,但这样其它具体路由优先。 编辑 :这是路由基本上第一路由方法j_mcnally建议。
  • 所有蛞蝓一样,是什么让一个有效的蛞蝓的逻辑,保持在这一个模型。 关注的,而不是污染良好分离说用户模型。 特别是如果蛞蝓规则对每个人都是一样的,他们都在这里。

在控制器将如何工作方面,我会用什么凯尔说和关键掉去sluggable_type领域找到你想要渲染视图。



文章来源: How to create app-wide slug routing for Rails app?