我正在使用 Rails,并且有一个用户输入的字段可以成为 URL 中的参数。我想添加一个验证,阻止用户输入任何会导致路由错误的字段,因为目前如果用户输入一个类似的值,我们会收到错误“没有路由匹配 [GET]...”到目前为止,我知道句号和斜线是不允许的...
我应该使用什么正则表达式进行验证?或者 Rails 默认使用什么正则表达式来处理动态段?
我正在使用 Rails,并且有一个用户输入的字段可以成为 URL 中的参数。我想添加一个验证,阻止用户输入任何会导致路由错误的字段,因为目前如果用户输入一个类似的值,我们会收到错误“没有路由匹配 [GET]...”到目前为止,我知道句号和斜线是不允许的...
我应该使用什么正则表达式进行验证?或者 Rails 默认使用什么正则表达式来处理动态段?
由于没有人真正回答过这个问题,因此只是建议了解决方法。(如果您在合适的情况下使用它们,这可能会更好。)我尝试找到导致问题的字符。我测试了标准美式键盘上所有可用的标点符号。我还测试了空间和(水平)选项卡。我没有测试任何扩展的 Unicode 标点符号,也没有测试控制字符。
我发现使用 webrick 和 Composite_primary_keys gem 在 Rails 3.2.9 中引起问题的字符是:
,/.%
要验证字段不包含这些字符:
validates :field_name, :format => { :with => /\A[^,\/\.%]*\z/,
:message => "commas, slashes, periods, and percent signs (,/.%) are not allowed"}
我尝试的许多其他字符在 URL 中直接无效,但 Rails 会自动对它们进行 URL 编码,因此它们不会引起问题。
正如在原始问题的评论中提到的,这些字符中的一些可以通过配置 Rails 而不是默认值来启用,但这样做会禁用 Rails 的其他功能。要启用它们,您需要在路由定义中添加:constraints
或:id
设置。
我还没有完全测试启用所有这些字符,但我相信后果是:
Ch 启用使用的后果 -- ------------------------------------------ , 不得使用 gem Composite_primary_keys / 限制路由到子项目的能力 . 禁用自动格式处理 %不确定是否可以启用
也许您可以让用户插入任何内容,而不是使用 to_params + parameterize 来编写 url,如果您想要一些正则表达式,请查看 parameterize 源代码。
to_params 示例,文档和源代码见: http ://apidock.com/rails/ActiveSupport/Inflector/parameterize
希望能帮助到你!
来自 action_pack action_dispath/journey/path/pattern.rb 中的 rails 代码
@separator_re = "([^#{separator}]+)" # where separator comes from @separators = "/.?"
因此,用于匹配动态段的默认正则表达式似乎是:
/([^\/\.\?])/