首页 > 解决方案 > 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"}第一个,我仍然无法解释。

标签: ruby-on-railsruby-on-rails-5

解决方案


推荐阅读