我正在使用Rails,并且用户输入的字段可以成为URL中的参数。我想添加一个验证,阻止用户输入任何会导致路由错误的字段,因为当前用户输入的值就像我们收到错误“没有路由匹配[GET] ...”到目前为止我知道句号和斜杠是不允许的......
我应该使用什么正则表达式进行验证?或者Rails默认为动态段使用什么正则表达式?
答案 0 :(得分: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 Consequence of enabling use -- --------------------------------------- , Must not use gem composite_primary_keys / Limits ability to route to child items . Disables automatic format handling % Not sure this can be enabled
答案 1 :(得分:0)
也许你可以让用户插入任何内容,而不是使用to_params + parameterize来编写url,如果你想要一些正则表达式,请看一下参数化源代码。
to_params示例,文档和源代码见: http://apidock.com/rails/ActiveSupport/Inflector/parameterize
希望它有所帮助!
答案 2 :(得分:0)
来自action_pack中的rails代码action_dispath / journey / path / pattern.rb
@separator_re = "([^#{separator}]+)" # where separator comes from @separators = "/.?"
因此,用于匹配动态段的默认正则表达式似乎是:
/([^\/\.\?])/