Rails通配符路由与数据库查找&多个控制器

时间:2014-07-18 03:36:08

标签: ruby-on-rails routes constraints wildcard

我有一个Rails应用程序设置,在定义了所有其他站点路由之后,我有一个全能通配符供我的用户在非保留路径的选定根级“虚荣”URL上显示其配置文件/关键字:

get '*path' => 'profiles#show'

然后,配置文件控制器会检查以确保路径定义有效的配置文件,否则重定向到root。这很好。

我现在需要做的是创建一种机制,其中catch-all 路径可以定义 个人资料一个博客在数据库中查找路径,以便适当的控制器路由到。

我不想进行重定向...我想在原始通配符网址上加载个人资料或博客内容。

我有哪些选择从通配路线开始 - > db lookup - >适当的控制器?

换句话说,这个逻辑可能会在哪里正确进行?

感谢。

1 个答案:

答案 0 :(得分:2)

您似乎想要一个匹配某些模式(正则表达式)的路由约束,该模式定义路径是否与路由匹配,或者是否尝试后续路由。也许是这样的。

get '*path', :to => 'profiles#show', :constraints => { path: /blog\/.+/ }

这个想法是你必须在路由级别知道一些东西,如果它可以基于路径,那么上面的东西将起作用,否则如果它需要更复杂,你可以使用自定义约束类。

# lib/blog_constraint.rb
class BlogConstraint
  def initialize
    @slugs = Blog.pluck(:slug)
  end

  def matches?(request)
    request.url =~ /blog\/(.+)/
    @slugs.include?($1)
  end
end

# config/routes.rb
YourApp::Application.routes.draw do
  get '*path', :to => 'blogs#show', :constraints => BlogConstraint.new
  get '*path', :to => 'profiles#show'
end