如何为访问者向我的Rails应用添加页面缓存?

时间:2015-10-21 01:46:35

标签: ruby-on-rails ruby-on-rails-4 caching heroku page-caching

说我在Heroku上有很多帖子的Rails 4.2网站。查看帖子时,应用程序会访问数据库以从其他模型获取帖子的数据和相关数据。 访问者(未登录的用户)到我的网站应该看到没有任何自定义的帖子,因此显示这些页面不应该要求访问数据库。如何为我的网站设置所有访客的简单页面或操作缓存(或等效文件),以便跳过数据库?我是否也可以让CDN接管渲染这些页面?

3 个答案:

答案 0 :(得分:3)

对于初学者,请查看the Rails caching guide。页面和操作缓存都已从Rails中删除。

您可以尝试片段缓存,它会抓取生成的帖子的HTML并将其存储起来,但您需要根据是否存在current_user条件。

超简单版本可能如下所示:

应用/视图/帖/ show.html.erb

<% cache_unless (current_user, @post) do %>
  <%= @post.body %>
<% end %>

如果该帖子存在缓存,则cache方法将成为读取操作,如果存在,则生成并写入操作缓存不存在。

使用ActiveRecord对象进行缓存会创建一个默认包含updated_at的键,因此如果帖子发生更改,加载帖子的第一个访问者将有更长的等待时间,并且每个后续访问者都将获得缓存。

至于你的另一个问题,还有许多其他基于Ruby的工具用于提供静态页面,对所有这些工具的评论是我所不知道的,可能超出了这个问题的范围。 :)

答案 1 :(得分:1)

Lanny Bose的回答看起来确实最好,但我会添加这个链接:

https://devcenter.heroku.com/articles/http-caching-ruby-rails#public-requests

整个页面很有用,但特别是它谈到将请求标记为公共或私有。默认情况下它们是私有的,但如果将其标记为公共,则允许页面由中间代理缓存提供。

链接页面将Rack :: Cache + memcache称为代理缓存;我不确定它是否仍然存在于rails 4中。

第二个heroku页面讨论了动作缓存,它可以为您缓存特定的操作:

https://devcenter.heroku.com/articles/caching-strategies#action-caching

答案 2 :(得分:0)

你真的不想在这里缓存。你只想在控制器和视图中使用条件,比如

# controller
if logged_in?
  @post = Post.find(params[:id])
  # load more records
end

# view
<% if @post %>
  <%= @post.title %>
  ...
<% else %>
  You're not logged in, blah blah.
<% end %>

..假设控制器不仅仅是加载帖子记录。我不一定同意有条件地加载上述记录,但您的用例可能需要它。

或者,如果出于性能原因需要缓存,您可以优雅地将当前用户ID包含在片段缓存键中,如

<% cache "post-#{@post.id}-#{current_user ? current_user.id : 0}" do %>
  <% if logged_in? %>
  ... # expensive operations
  <% else %>
    Please login to see more..
  <% end %>
<% end %>

以便缓存使用与用户或匿名相同的代码。