【问题标题】:Trouble on caching an action when I rewrite a URL重写 URL 时缓存操作出现问题
【发布时间】:2011-03-18 18:06:17
【问题描述】:

我正在使用 Ruby on Rails 3,当我使用 to_param 方法重写模型中的 URL 时,我遇到了缓存问题。

在我的用户模型中,我有:

class User < ActiveRecord::Base
  def to_param # Rewrites URL
    "#{self.id}-#{self.name}-#{self.surname}"
  end

  ...
end

在用户控制器中我有:

class UsersController < ApplicationController
  caches_action :show

  def show
    ...
  end
end

在我的用户清扫器中:

class UsersSweeper < ActionController::Caching::Sweeper
  observe User

  def after_save(user)
    clear_users_cache(user)
  end

  def after_destroy(user)
    clear_users_cache(user)
  end

  def clear_users_cache(user)
    expire_action :controller => :users, :action => :show, :id => user
  end
end

现在,当我浏览日志文件中的用户显示页面时,我得到:

Write fragment views/<my_site_name>/users/2-Test_name-Test_surname (0.3ms)

当我在日志文件中更改姓名或姓氏后使缓存过期时,我得到

Expire fragment views/<my_site_name>/users/2-New_test_name-New_test_surname (0.3ms)

因此,由于数据已更改,它不会使缓存过期,因为 Rails 会尝试使 2-New_test_name-New_test_surname 过期而不是 2-Test_name-Test_surname

如何“轻松”处理 Rails 缓存行为以使其正常工作?


P.S.:当然,如果我不使用to_param 方法,它也可以工作。


更新

我可以做这样的事情

caches_action :show, :cache_path => Proc.new { |c| 'users/' + c.params[:id].split('-').first }

但我认为这不是解决问题的好方法......

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 caching url


    【解决方案1】:

    尝试使用自定义路径:

    您可以通过传递:cache_path 选项来设置修改默认操作缓存路径。这将直接传递给ActionCachePath.path_for。这对于具有多个可能的路由的操作来说很方便,这些路由应该以不同的方式缓存。如果给定了一个块,则使用当前控制器实例调用它。

    caches_action :show, :cache_path => { :project => 1 }
    

    显然可以根据您的需要进行定制。请参阅API 了解更多信息。

    【讨论】:

    • 我尝试做类似 ':cache_path => { :project => "#{@user.id}-#{@user.firstname}-#{@user.lastname}" } ' 和其他人“实验”,但它不起作用。无论如何,我认为这对我没有帮助,因为在 Rails 使缓存过期之前用户名和姓氏会发生变化,因此它将尝试使“2-New_test_name-New_test_surname”而不是“2-Test_name-Test_surname”过期。也许我必须保留\传递旧的用户名和姓氏值。
    • 我更新了问题,添加了一个可能但不是最好的解决方案。
    • 为什么您编辑问题的解决方案不是最好的?它完全符合您的需要,并以我的回答为基础。
    • 因为该解决方案仅适用于 'def to_param "#{self.id}-#{self.name}-#{self.surname}" end' 语句,但我想要一种更“通用的方法”。
    • 实际上它适用于任何以 ID 开头的字符串,或者紧跟一个连字符,然后是其他文本,或者什么都不带。
    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2023-03-10
    相关资源
    最近更新 更多