我有一个Rails应用程序设置,在定义了所有其他站点路由之后,我有一个全能通配符供我的用户在非保留路径的选定根级“虚荣”URL上显示其配置文件/关键字:
get '*path' => 'profiles#show'
然后,配置文件控制器会检查以确保路径定义有效的配置文件,否则重定向到root。这很好。
我现在需要做的是创建一种机制,其中catch-all 路径可以定义 个人资料或一个博客在数据库中查找路径,以便适当的控制器路由到。
我不想进行重定向...我想在原始通配符网址上加载个人资料或博客内容。
我有哪些选择从通配路线开始 - > db lookup - >适当的控制器?
换句话说,这个逻辑可能会在哪里正确进行?
感谢。
答案 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