如何在布局中使用Rails caches_action:false并动态更改元标记?

时间:2016-03-23 11:02:04

标签: ruby-on-rails caching seo meta-tags

我坚持认为Rails Web应用程序中的一个非常简单/常见的用例。我想使用" caches_action,layout:false"并从布局中显示将由操作设置的动态标签(来自视图或控制器)。

我找不到任何标准的rails方式来执行此操作,因为 content_for 不能与 caches_action 一起使用,实例变量不会缓存(?),以及元标记辅助宝石我尝试过的(metamagicmeta-tags)不支持此用例。

有没有办法做到这一点?

实施例

我在SandboxController上使用caches_action,layout:false#show method

#app/controllers/sandbox_controller.rb
class SandboxController < ApplicationController

  caches_action :show, layout: false, expires_in: 1.minute

  def show
    @meta_title = "Best page ever"
    do_some_expensive_operation
  end

end

视图

#app/views/sandbox/show.html.erb
We are in show action.

布局

#app/views/layouts/application.html.erb
<title><%= @meta_title %></title>
Debug: <%= @meta_title %> <br/>
<%= yield %>

谢谢!

1 个答案:

答案 0 :(得分:1)

我找到了一种让它工作的方法,它不像我希望的那样漂亮,但它有助于使用caches_action并从视图中设置HTML元标记。

此外,为了记录,似乎这被遗忘并埋藏在管道深处,因为我没有找到any recent mentions of this problem,只有caches_action和content_for在一起are not expected to work.

解决方案:我只需使用尽可能少的计算来添加before_action来设置元标记。

#app/controllers/sandbox_controller.rb
class SandboxController < ApplicationController

  caches_action :show, layout: false, expires_in: 1.minute
  before_action :seo_show, only: :show

  def seo_show
    @meta_title = "Best page ever"
  end

  def show
    do_some_expensive_operation
  end

end

值得注意的是,它也可以与metamagic gem结合使用。

布局:

#app/views/layouts/application.html.erb
<%= default_meta_tags && metamagic %>
<%= yield %>

帮助者:

#app/helpers/application_helper.rb
module ApplicationHelper

  def default_meta_tags
    meta title: @meta_title || "Default meta-title of my website"
  end
end

希望这有助于那里的人!