1

我正在使用 Rails,并且有一个用户输入的字段可以成为 URL 中的参数。我想添加一个验证,阻止用户输入任何会导致路由错误的字段,因为目前如果用户输入一个类似的值,我们会收到错误“没有路由匹配 [GET]...”到目前为止,我知道句号和斜线是不允许的...

我应该使用什么正则表达式进行验证?或者 Rails 默认使用什么正则表达式来处理动态段?

4

3 回答 3

1

由于没有人真正回答过这个问题,因此只是建议了解决方法。(如果您在合适的情况下使用它们,这可能会更好。)我尝试找到导致问题的字符。我测试了标准美式键盘上所有可用的标点符号。我还测试了空间和(水平)选项卡。我没有测试任何扩展的 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
/ 限制路由到子项目的能力
. 禁用自动格式处理
%不确定是否可以启用
于 2013-01-14T20:54:32.763 回答
0

也许您可以让用户插入任何内容,而不是使用 to_params + parameterize 来编写 url,如果您想要一些正则表达式,请查看 parameterize 源代码。

to_params 示例,文档和源代码见: http ://apidock.com/rails/ActiveSupport/Inflector/parameterize

希望能帮助到你!

于 2013-01-04T20:01:45.823 回答
0

来自 action_pack action_dispath/journey/path/pattern.rb 中的 rails 代码

@separator_re = "([^#{separator}]+)" # where separator comes from @separators = "/.?"

因此,用于匹配动态段的默认正则表达式似乎是:

/([^\/\.\?])/
于 2014-11-14T10:39:23.997 回答