Rails用'。'截断参数在网址中

时间:2013-07-17 08:36:50

标签: ruby-on-rails ruby url escaping

我正在尝试将IP地址作为参数发送到网址中的Rails方法destroy。如果参数包含.,则会出现问题;我收到not found个错误,这是生成的日志:

Started DELETE "/admin/user/stefan-admin/whitelist/4.3.2.1" for 127.0.0.1 at 2013-07-17 09:31:18 +0100
Processing by ErrorsController#error_404 as 
  Parameters: {"not_found"=>"admin/user/stefan-admin/whitelist/4.3.2"}
WARNING: Can't verify CSRF token authenticity
Session: {:user=>"admin", :role=>:admin, :user_id=>"stefan-admin"}
Completed 404 Not Found in 30ms (Views: 1.1ms | ActiveRecord: 0.0ms)

not found消息有一个截断的IP地址。如果我使用不带.的参数,例如abc,我没有收到not found错误,并且调用了destroy方法。

Rails收到了url,但随后在内部对其进行了修改,可能是因为它正在处理.作为扩展。有没有办法关闭这种行为或逃避网址以避免它?

4 个答案:

答案 0 :(得分:5)

您需要在路径中添加约束以允许参数中的点

资源:白名单,:constraints => {:id => /[0-9.]+/}

或者你的routes.rb中有类似的东西,这取决于你如何写你的路线,但约束部分保持不变

答案 1 :(得分:4)

“截断”IP地址的原因是({可选] (.:format)resources,'获取','匹配'等在每条路线上生成。

您可以指定不使用以下格式的专用路线:

match '/admin/user/:id/whitelist/*ip', to: 'controller#action', format: false

注意最后一个参数的*。它收集了网址的其余部分。

答案 2 :(得分:1)

乍一看,问题可以通过操纵参数或路由来解决。通过多思考,你会发现你的方案中还有两个问题:

  1. 您使用GET请求处理删除操作
  2. 如果不是名称扩展名,则网址中的点非常难看。
  3. 所以,我建议你不要直接解决问题:

    查看包含请求链接的视图代码。最好是button_tolink_to delete方法和UJS支持。

    通过这种方式,您将向服务器发送POST请求而不使用URL中的IP。而且您不需要对控制器代码进行任何更改。

答案 3 :(得分:0)

找到了一种执行它的hacky方法。如果您的路线看起来像这样

match 'controller/:some_param' => 'controller#action'

然后在控制器动作中,你可以做这样的事情

actual_param = params[:some_param]
if params[:format]
  actual_param << "." << params[:format]
end

然后使用actual_param来识别正确的资源