ruby-on-rails - url id 不小心被 rails 中的 favicon 替换了
问题描述
我从事 Rails 项目(rails 5.2.4)已有一段时间了。大多数事情都很好。但我有时会遇到一个问题,即id
包含在 url 中的字符串意外替换为favicon
.
例如,在这里我输入了http://myproject.com/objects/153
. 日志显示
I, [2020-10-22T20:45:17.394223 #14] INFO -- : Processing by ObjectController#show as
I, [2020-10-22T20:45:17.394289 #14] INFO -- : Parameters: {"id"=>"favicon"}
I, [2020-10-22T20:45:17.401109 #14] INFO -- : Rendered object/show.html.erb within layouts/application (3.5ms)
I, [2020-10-22T20:45:17.401247 #14] INFO -- : Completed 500 Internal Server Error in 7ms (ActiveRecord: 0.4ms)
代码最后显示 500 的原因是有一个 before 操作可以通过 using 获取记录Object.find()
。但显然,由于id
已替换为favicon
,无法找到所需的记录。
但是,如果我输入另一个网址,例如http://myproject.com/objects/151
,效果很好。在日志中,您可以看到
I, [2020-10-22T20:45:17.394223 #14] INFO -- : Processing by ObjectController#show as
I, [2020-10-22T20:45:17.394289 #14] INFO -- : Parameters: {"id"=>"151"}
I, [2020-10-22T20:45:17.401109 #14] INFO -- : Object Load (0.2ms) SELECT "objects".* FROM "objects" WHERE "objects"."id" = ? ORDER BY "objects"."name" ASC LIMIT ? [["id", 151], ["LIMIT", 1]]
routes.rb 配置为
resources :objects, only: [:new, :create, :show, :edit, :index, :update, :destroy ]
所以我不知道为什么相同的代码适用于一种情况但不能适用于另一种情况。而且我不知道如何调试。因为代码的第一行是@object = Object.find(params[:id])
.
有关详细信息,请参阅下面附加的 app/views/layouts/application.html.erb。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<% app = respond_to?(:app_name) ? app_name : "Define helper method 'app_name'"%>
<title>
<%= app %>
</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<!--[if lte IE 9]>
<%= split_stylesheet_link_tag 'application' %>
<![endif]-->
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
<%= google_analytics %>
<%= favicon_link_tag %>
</head>
<body class="<%= controller_name %> <%= action_name %>" style="background-color: #f6f6f6; margin-bottom: 50px;">
<% content_style = "" %>
<% if @redirect_to_if_iframe %>
<% content_style = "display:none" %>
<% end %>
<div id="maincontent" style="<%= content_style %>">
<% if @redirect_to_if_iframe %>
<%= javascript_tag("redirect_if_iframe('#{@redirect_to_if_iframe}', 'maincontent');") %>
<% end %>
<div id="headerbar" style="display:block; position: fixed; top:0; width: 100%; z-index: 9999999;">
<%= javascript_tag("handlePortal('headerbar');") %> <!-- found in datacommon.js -->
<header>
<nav class="navbar navbar-default myproject-nav" role="navigation" style="height: 71px !important;">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<div class="navbar-brand">
<%= image_tag "https://cloud.data-static.myproject.com/resources/images/current/logos/myproject-white.png", :align=>'middle', :alt=>"MyProject logo"%>
</div>
</div>
<%if action_name != 'welcome' %>
<div class="app_name_text", style="color: white; float: left;">
<%= app %>
</div>
<%= render :partial=>'layouts/myproject/userinfo' %>
<%end%>
</div>
</nav>
</header>
</div>
<%if action_name != 'welcome' %>
<%= render :partial=>"layouts/myproject/navbar" %>
<%end%>
<div class="loading-container" style="margin-top: 100px;">
<!-- <div class="loading-container">-->
<div class="loading">
<div class="icon">
<%= image_tag "loading.gif" %>
</div>
</div>
<div class='container-fluid yield'
style="background-color: white;
height: max-content;
width: 95%;
margin-top: 150px;
position: relative;
border-radius: 5px;">
<%= yield %>
</div>
</div>
</div>
</body>
<%= send_tracking_data %>
</html>
更新:虽然我确实找到了这个问题的根本原因,但我仍然无法解释为什么实际的 id 会被favicon
字符串替换。根本原因是如果用户输入了一些无效的输入,相应的视图页面的 html 可能会由于模型的格式问题而崩溃。这种输入对模型不是无效的,但对html代码显示无效。所以页面正在渲染500
。但是我应该看到指示 id 是实际的日志,然后在视图页面的某一行发生错误。但它显示了{"id"=>"favicon"}
第一个,我仍然无法解释。
解决方案
推荐阅读
- node.js - 尝试在部署项目之前设置 heroku buildpack
- java - java.lang.ClassNotFoundException:javax.ws.rs.ProcessingException - 我该如何解决这个问题?
- r - 导出自定义调色板
- azure-keyvault - Key Vault 中的访问控制和访问策略之间的区别
- python - {Python 3.8} setuptools 上的 Pip 命令错误
- node.js - Node JS蓝牙模块安装错误
- html - 如何让这个 flex-direction-column 布局在 Mobile Safari 中工作?
- azure - 有人能解释一下三角洲湖的“黄金”表是如何被推入数据仓库的吗?有没有办法从增量格式转换为数据框?
- php - 使用 OAUTH2 登录用户进行 Discord,然后加入 Guild
- python - 如何增强循环中数据框的构建?