【问题标题】:Do rails routing constraint regexps have implicit anchors?rails 路由约束正则表达式是否具有隐式锚点?
【发布时间】:2012-09-17 15:07:29
【问题描述】:

我的应用中有一条如下所示的路线:

match '/:id' => 'controller#action', :constraints => { :id => VALID_IDS }

其中 VALID_IDS 是一个正则表达式白名单,例如

/(good_id|another_good_id|a_valid_id)/

现在看来,uri

/good_id_one

不匹配这个约束,即使

1.9.2p318 :004 > "good_id_one".match /^(good_id|another_good_id|a_valid_id)/
 => #<MatchData "good_id" 1:"good_id">

这是为什么呢?我有一个怀疑。 This guide 这么说

:constraints 接受正则表达式,但不能使用正则表达式锚。 但是请注意,您不需要使用锚点,因为所有路线都在开始时锚定。

rails在正则表达式的end处添加anchor也是这种情况吗?这可以解释我所看到的,因为

1.9.2p318 :006 > "good_id_one".match /^(good_id|another_good_id|a_valid_id)$/
 => nil

但是,我不确定这种怀疑是否正确。谁能证实或否认我的假设?

(附言,Rails 3.0.11, Ruby 1.9.2

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 routes


    【解决方案1】:

    这不是因为隐含的锚点,而是因为你的表达式末尾的 /。

    试试:

    /(good_id|another_good_id|a_valid_id)
    

    【讨论】:

    • 抱歉,该字面语法仅用于演示目的。正则表达式匹配器实际上是由 Regexp.new("(good_id|another_good_id|a_valid_id)") 构建的。斜杠不是正则表达式的一部分。
    • 在那种情况下,我认为你需要在开头有 / 。 Regexp.new("/(good_id|another_good_id|a_valid_id)") 而这个是因为anchor。
    • Rails 匹配正则表达式的对象是params[:id],它不包括前导/。如果添加,则路由与以下路径中的 任何一个都不匹配:/good_id/good_id_one
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2019-02-10
    • 2011-06-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多