6

我正在尝试将 IP 地址作为参数发送到destroyurl 中的 Rails 方法。如果参数包含.;则会出现问题 我收到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,但随后在内部对其进行了修改,可能是因为它正在.作为扩展处理。有什么方法可以关闭这种行为或转义 url 以避免它?

4

4 回答 4

5

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

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

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

于 2013-07-17T09:11:44.813 回答
4

“截断” IP 地址的原因是(可选)在每条路由上(.:format)生成resources的 'get'、'match' 等。

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

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

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

于 2013-07-17T09:09:32.130 回答
1

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

  1. 您使用 GET 请求来处理删除操作
  2. url中的点,如果不是为了扩展名,非常难看。

因此,我建议您不要直接解决问题,而是:

查看包含请求链接的视图代码。最好是 a button_to,或者 a link_towithdelete方法和 UJS 支持。

这样,您将向服务器发送一个 POST 请求,而 URL 中没有 ip。而且您不需要对控制器代码进行任何更改。

于 2013-07-17T09:20:28.950 回答
0

找到了一个hacky方法来做到这一点。如果您的路线看起来像这样

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

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

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

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

于 2013-07-17T09:10:13.907 回答