routes.rb のrequirements のregexp に行頭記号とか使わないこと

舞波本を参考に

map.hoge 'foo/:bar/:baz', :controller => 'foo', :action => 'show', :requirements => {:date => /^\d{8}$/}

とすると、Regexp anchor characters are not allowed in routing requirements とかってエラー。


該当箇所のソースを眺めてみた。

actionpack-1.13.3/lib/action_controller/routing.rb

def assign_route_options(segments, defaults, requirements)
  route_requirements = {} # Requirements that do not belong to a segment

  segment_named = Proc.new do |key|
    segments.detect { |segment| segment.key == key if segment.respond_to?(:key) }
  end

  requirements.each do |key, requirement|
    segment = segment_named[key]
    if segment
      raise TypeError, "#{key}: requirements on a path segment must be regular expressions" unless requirement.is_a?(Regexp)
      if requirement.source =~ %r{\A(\\A|\^)|(\\Z|\\z|\$)\Z}
        raise ArgumentError, "Regexp anchor characters are not allowed in routing requirements: #{requirement.inspect}"
      end
      segment.regexp = requirement
    else
      route_requirements[key] = requirement
    end
  end

  defaults.each do |key, default|
    segment = segment_named[key]
    raise ArgumentError, "#{key}: No matching segment exists; cannot assign default" unless segment
    segment.is_optional = true
    segment.default = default.to_param if default
  end

  assign_default_route_options(segments)
  ensure_required_segments(segments)
  route_requirements
end


この部分で引っかかったのかな。

if requirement.source =~ %r{\A(\\A|\^)|(\\Z|\\z|\$)\Z}
  raise ArgumentError, "Regexp anchor characters are not allowed in routing requirements: #{requirement.inspect}"
end


ってことで、

map.hoge 'foo/:bar/:baz', :controller => 'foo', :action => 'show', :requirements => {:date => /\d{8}/}

これだけでも、8桁の数字以外にはマッチしないのでよしとする。