【问题标题】:How to prevent partials in main layout from being re-rendered/updated on every page request?如何防止在每个页面请求上重新渲染/更新主布局中的部分?
【发布时间】:2013-10-29 06:32:16
【问题描述】:

环顾了几个小时,阅读博客和许多其他 SO 问题都没有成功,我终于寻求帮助。

我相信我对 Rails 布局/渲染/屈服机制仍然缺乏一些了解。 因此,这可能是一个愚蠢的问题。对不起。

是否可以防止在每个页面请求上呈现部分内容?我的意思是,每次我点击应用上的链接时,都会重新加载布局和局部。

我的目标是有一个静态的侧边栏,通过渲染部分“第一次加载 application.html.erb”来填充它,然后只使用 ajax 更新它。

这是我的应用布局:

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><%= content_for?(:title) ? yield(:title) : "GEN" %></title>
    <meta name="description" content="<%= content_for?(:description) ? yield(:description) : "GEN" %>">
    <%= stylesheet_link_tag "application", :media => "all" %>
    <%= javascript_include_tag "application" %>
    <%= csrf_meta_tags %>
  </head>
  <body class="darkbody">
    <header class="navbar navbar-fixed-top navbar-inverse">
      <nav class="navbar-inner">
        <div class="container-fluid">
          <%= render 'layouts/navigation' %>
        </div>
      </nav>
    </header>
    <main role="main">
      <div class="container-fluid">

         <div class="row-fluid">
          <div class="span3">

            <%= render partial: 'charts/dashboard', layout: false %>

          </div>

          <div class="span9">
            <div class="well well-small">
              <%= render 'layouts/messages' %>

              <%= yield %>  

            </div>
          </div>

        </div>

      </div>
    </main>
  </body>

</html>

“仪表板”部分应该加载一次并且永远不会再次呈现。 换句话说,导航应用程序会更改/刷新 yield 部分中的内容,但不会更改/刷新主布局“部分”中的内容。

动机?仪表板使用辅助方法来显示一个在整个用户会话期间计算出来且从不更新的值。如果我得到很多重新加载,这个帮助程序会在每次用户点击时运行,并且即使返回相同的结果也会对应用服务器施加压力,确实会发生什么。

这是太疯狂还是太愚蠢了?

最好的问候,

广告

【问题讨论】:

    标签: ruby-on-rails layout render partials


    【解决方案1】:

    实际上,它会在每次请求时从这个模板渲染 HTML,但是如果模板中显示的数据不需要一直是真实的,你可以尝试动作或片段缓存,如下所示:

      <div class="span3">
        <% cache 'dashboard' do %>
          <%= render partial: 'charts/dashboard', layout: false %>
        <% end %>
      </div>
    

    您可以在 Rails 指南中阅读更多详细信息 (http://guides.rubyonrails.org/caching_with_rails.html#fragment-caching)

    【讨论】:

    • 非常好,@Ivan K。在开发模式下测试有什么技巧吗?我将我的“渲染”语句包装在缓存块中并成功。我应该在缓存参数中使用完整路径吗?
    • 来来回回,我开始相信缓存不会有帮助。我在爬取数据库的部分中有一个辅助函数......我应该找到另一种方法,并在不久的将来转移到 SPA。完整的 ajax 就可以了,恕我直言。
    猜你喜欢
    • 2021-01-01
    • 2020-04-24
    • 2015-08-15
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2019-10-17
    相关资源
    最近更新 更多