【问题标题】:How do I add page caching to my Rails app for visitors?如何为访客添加页面缓存到我的 Rails 应用程序?
【发布时间】:2016-01-19 21:04:40
【问题描述】:
假设我在 Heroku 上有一个 Rails 4.2 网站,上面有很多帖子。查看帖子时,应用程序会访问数据库以从其他模型中获取帖子的数据和相关数据。 访问者(未登录的用户)访问我的网站应该会看到没有任何自定义的帖子,因此显示这些页面不需要访问数据库。如何为我网站的所有访问者设置简单的页面或操作缓存(或等效项),从而跳过数据库?我也可以让 CDN 接管渲染这些页面吗?
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-4
caching
heroku
page-caching
【解决方案2】:
对于初学者,请查看the Rails caching guide。页面和动作缓存都已从 Rails 中删除。
您可以尝试片段缓存,它会抓取帖子生成的 HTML 并将其存储起来,不过您需要一个基于是否存在 current_user 的条件。
一个超级简单的版本可能看起来像:
app/views/posts/show.html.erb
<% cache_unless (current_user, @post) do %>
<%= @post.body %>
<% end %>
如果该帖子存在缓存,cache 方法将是一个 read 操作,如果该缓存不存在,它将是一个 generate and write 操作'不存在。
使用 ActiveRecord 对象进行缓存会默认创建一个包含updated_at 的键,因此如果帖子发生更改,加载帖子的第一个访问者将有更长的等待时间,并且每个后续访问者都将获得缓存的好处。
至于您的其他问题,还有许多其他基于 Ruby 的工具可用于提供静态页面,而对所有这些工具的回顾超出了我的知识范围,并且可能超出了本问题的范围。 :)
【解决方案3】:
你真的不想在这里缓存。您只需要控制器和视图中的条件,例如
# 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 %>
以便缓存对用户或匿名用户使用相同的代码。