【问题标题】:How to programmatically get a Rails Routes constraint?如何以编程方式获取 Rails Routes 约束?
【发布时间】:2020-09-07 20:24:55
【问题描述】:

我正在尝试收集所有 Rails 路由,并转储它们的 named_routepathconstraint(如果有的话)。

我能够获得named_routepath,但我正在尝试找到一种方法来获得constraint 的路线。

routes = Rails.application.routes.routes.map do |route|
 path = route.path.spec.to_s.gsub!("(.:format)", '')

 # route.constraints always output {} ??
 puts route.constraints

 name = route.name
 [name, path]
end.to_h

这是一个路线的例子..

USER_NAME_PATTERN ||= /@[a-z0-9][-a-z0-9]+/
get ":username/:slug", to: 'calcs#show', as: :user_calc , constraints: {username: USER_NAME_PATTERN }

如何以编程方式获取 Rails Routes 约束?

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案1】:

    约束有点复杂,因为路由约束有多种,在routes.rb中的指定方式相同,但内部处理方式略有不同。

    您问题中的约束类型是segment constraint,它对路径的一个或多个段强加一种格式。段约束存储在路径级别的requirements 哈希中,使用与段名称对应的键(段名称存储在Routeparts 属性中)。

    > route = Rails.application.routes.named_routes.get(:user_calc)
    => #<ActionDispatch::Journey::Route:0x00007f6aa05b2cc0>
    > route.parts
    => [:username, :slug, :format]
    > route.path.requirements
    => {:username=>/@[a-z0-9][-a-z0-9]+/}
    

    还有request constraints,它基于返回字符串的Request 对象上的任何方法来约束路由。这些指定类似于段约束:

    get ":username/:slug", to: 'calcs#show', as: :user_calc , constraints: {subdomain: 'admin'}
    

    请求约束存储在Route 对象的constraints 属性中。

    > route = Rails.application.routes.named_routes.get(:user_calc)
    => #<ActionDispatch::Journey::Route:0x00007f6aa05b2cc0>
    > route.constraints
    => {:subdomain=>"admin"}
    

    您还可以使用lambda 或响应.matches? 的类来指定约束。这些高级约束似乎是由不同的机制处理的,但我还没有深入研究代码以了解确切的方法。

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 2015-03-05
      • 2015-06-10
      • 1970-01-01
      相关资源
      最近更新 更多