rails 3 caching: действие expire для именованного маршрута - PullRequest
6 голосов
/ 16 августа 2011

Мой контроллер имеет это:

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??

Ответы [ 3 ]

5 голосов
/ 12 сентября 2011

Используйте версию регулярного выражения expire_fragment :

expire_fragment %r{render_c_t/#{c.id}/}
0 голосов
/ 13 сентября 2011
caches_action :render_ticker_for_channel, :if => proc do 
  !!params['doCache']
end

Но чтобы это решение работало, нам нужно передать дополнительный параметр либо через строку запроса, либо через тело сообщения.

0 голосов
/ 09 сентября 2011

Определенно, для этого должен быть более «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))

Не самое красивое решение, но должно работать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...