phi*_*hil 6 ruby caching ruby-on-rails ruby-on-rails-3
我的控制器有这个:
caches_action :render_ticker_for_channel, :expires_in => 30.seconds
Run Code Online (Sandbox Code Playgroud)
在我的路线文件中我有这个:
match '/render_c_t/:channel_id' => 'render#render_ticker_for_channel', :as => :render_channel_ticker
Run Code Online (Sandbox Code Playgroud)
在日志文件中我看到:
Write fragment views/mcr3.dev/render_c_t/63 (11.6ms)
Run Code Online (Sandbox Code Playgroud)
我该如何手动过期?我需要从与渲染控制器不同的控制器使其到期,但即使在渲染控制器中,我也无法让它过期正确的东西.
如果我做:
expire_action(:controller => 'render', :action => 'render_ticker_for_channel', :id => c.id)
Run Code Online (Sandbox Code Playgroud)
我知道了:
Expire fragment views/mcr3.dev/render/render_ticker_for_channel/63 (3.2ms)
Run Code Online (Sandbox Code Playgroud)
如果我做:
expire_action(:controller => 'render', :action => 'render_c_t', :id => c.id)
Run Code Online (Sandbox Code Playgroud)
我知道了:
Expire fragment views/mcr3.dev/render/render_c_t/63 (3.2ms)
Run Code Online (Sandbox Code Playgroud)
这个:
expire_action("render_c_t/#{c.id}")
Run Code Online (Sandbox Code Playgroud)
生产:
Expire fragment views/render_c_t/63 (3.5ms)
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它过期'caches_action'产生的路径?!
使用expire_fragment的正则表达式版本:
expire_fragment %r{render_c_t/#{c.id}/}
Run Code Online (Sandbox Code Playgroud)
肯定应该有一个更多的“Rails Way”来做到这一点,但这可能会起到后门的作用:Rails.application.routes.url_helpers将让您访问您的助手,每个助手都会返回一个字符串,该字符串是将发送到浏览器的路径和/或 url在位置标头中。
尝试Rails.application.routes.url_helpers.render_ticker_for_channel_path(63)哪个应该返回/render_c_t/63,Rails.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))
Run Code Online (Sandbox Code Playgroud)
不是最漂亮的解决方案,但应该可行!
| 归档时间: |
|
| 查看次数: |
2155 次 |
| 最近记录: |