Я хочу использовать задачу Граблей кэшировать мою карту сайта так, чтобы запросы на sitemap.xml
не возьмет навсегда. Вот то, что я имею до сих пор:
@posts = Post.all
sitemap = render_to_string :template => 'sitemap/sitemap', :locals => {:posts => @posts}, :layout => false
Rails.cache.write('sitemap', sitemap)
Но когда я пытаюсь выполнить это, я получаю ошибку:
undefined local variable or method `headers' for #<Object:0x100177298>
Как я могу представить шаблон к строке из Граблей?
Вот как я это сделал:
av = ActionView::Base.new(Rails::Configuration.new.view_path)
av.class_eval do
include ApplicationHelper
end
include ActionController::UrlWriter
default_url_options[:host] = 'mysite.com'
posts = Post.all
sitemap = av.render 'sitemap/sitemap', :posts => posts
Rails.cache.write('sitemap', sitemap)
Обратите внимание, что я преобразовал свой шаблон в частичный, чтобы это работало
Существует сообщение о том, как получить доступ к методам и контексту ActionView :: Base из задачи rake.
Однако это обезьяна. Почему бы не использовать механизм кэширования rails для выполнения кэширования? :)
Позднее редактирование: Функция render_to_string определена в контексте ActionController :: Base.
Ниже приведено решение о том, как заставить его работать из задач rake, взято из omninerd .
# In a rake task:
av = ActionView::Base.new(Rails::Configuration.new.view_path)
Rails.cache.write(
"cache_var",
av.render(
:partial => "view_folder/some_partial",
:locals => {:a_var => @some_var}
)
)