在Rails中的动态段(param)中允许哪些字符?

时间:2013-01-04 18:53:06

标签: ruby-on-rails regex routing

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

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

3 个答案:

答案 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 = "/.?"

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

/([^\/\.\?])/