【问题标题】:rails 3 caching: expire action for named routerails 3 缓存:命名路由的过期操作
【发布时间】:2011-10-27 22:48:05
【问题描述】:

我的控制器有这个:

caches_action :render_ticker_for_channel, :expires_in => 30.seconds

在我的路线文件中,我有这个:

match '/render_c_t/:channel_id' => 'render#render_ticker_for_channel', :as => :render_channel_ticker

在日志文件中我看到:

Write fragment views/mcr3.dev/render_c_t/63 (11.6ms)

如何手动过期?我需要从与渲染控制器不同的控制器使它过期,但即使在渲染控制器中我也无法让它过期。

如果我这样做:

 expire_action(:controller => 'render', :action => 'render_ticker_for_channel', :id => c.id)

我明白了:

Expire fragment views/mcr3.dev/render/render_ticker_for_channel/63 (3.2ms)

如果我这样做:

expire_action(:controller => 'render', :action => 'render_c_t', :id => c.id)

我明白了:

Expire fragment views/mcr3.dev/render/render_c_t/63 (3.2ms)

这个:

expire_action("render_c_t/#{c.id}")

产生:

Expire fragment views/render_c_t/63 (3.5ms)

如何让它与“caches_action”产生的路径相同?!

【问题讨论】:

  • 我没有足够的信心将此添加为完整的答案,但是您是否尝试过后门? Rails.application.routes.url_helpers 将允许您访问您的助手并返回一个字符串,该字符串是路径和/或 URL,它将在 Location 标头中发送到浏览器。试试Rails.application.routes.url_helpers.render_ticker_for_channel_path(63)Rails.application.routes.url_helpers.render_ticker_for_channel(63, :host => 'mcr3.dev') 你也许可以将结果字符串(通过一些操作)传递给expire_action 并让它找到正确的缓存块。丑陋,但可能有用

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


【解决方案1】:

使用expire_fragment的正则表达式版本:

expire_fragment %r{render_c_t/#{c.id}/}

【讨论】:

  • 如果您在 file_store 上有缓存,这是使用 RegEx 过期的最佳方式
【解决方案2】:

肯定应该有更多的“Rails 方式”来执行此操作,但这可能会作为后门:Rails.application.routes.url_helpers 将允许您访问您的助手,并且每个将返回一个字符串,该字符串是路径和/或 url将在 Location 标头中发送到浏览器。

尝试Rails.application.routes.url_helpers.render_ticker_for_channel_path(63) 应该返回/render_c_t/63Rails.application.routes.url_helpers.render_ticker_for_channel(63, :host => 'mcr3.dev') 应该返回http://mcr3.dev/render_c_t/63

通过一些操作,您可以解析第二个字符串以返回 Rails 用于缓存操作的名称:

def funky_action_cache_name(route, params)
  Rails.application.routes.url_helpers.send(route.to_s+'_url', params).gsub(/https?:\/\//,'')
end

# expire_action(funky_action_cache_name(:render_ticker_for_channel, :id => 63))

不是最漂亮的解决方案,但应该可以!

【讨论】:

    【解决方案3】:
    caches_action :render_ticker_for_channel, :if => proc do 
      !!params['doCache']
    end
    

    但是要使这个解决方案起作用,我们需要通过查询字符串或帖子正文传递一个额外的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多