2010-06-18 2 views
0

Я пытаюсь инкапсулировать логику для создания моей карты сайта в отдельном классе, так что я могу использовать задержанный :: Работы для его генерации из группы:Trouble рендеринг представления в обобщенном классе

class ViewCacher 
    include ActionController::UrlWriter 

    def initialize 
    @av = ActionView::Base.new(Rails::Configuration.new.view_path) 
    @av.class_eval do 
     include ApplicationHelper  
    end 
    end 

    def cache_sitemap 
    songs = Song.all 

    sitemap = @av.render 'sitemap/sitemap', :songs => songs 
    Rails.cache.write('sitemap', sitemap) 
    end 
end 

Но всякий раз, когда я пытаюсь ViewCacher.new.cache_sitemap я получаю эту ошибку:

ActionView::TemplateError: 
ActionView::TemplateError (You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.url_for) on line #5 of app/views/sitemap/_sitemap.builder: 

Я полагаю, это означает, что ActionController::UrlWriter не входит в нужном месте, но я действительно не знаю,

ответ

0

Делает ли это то, что вы пытаетесь сделать? Это непроверено, просто идея.

в Lib/view_cacher.rb

module ViewCacher 
    def self.included(base) 
    base.class_eval do 
     #you probably don't even need to include this 
     include ActionController::UrlWriter 
     attr_accessor :sitemap 

     def initialize 
     @av = ActionView::Base.new(Rails::Configuration.new.view_path) 
     @av.class_eval do 
      include ApplicationHelper  
     end 
     cache_sitemap 
     super 
     end 

     def cache_sitemap 
     songs = Song.all 

     sitemap = @av.render 'sitemap/sitemap', :songs => songs 
     Rails.cache.write('sitemap', sitemap) 
     end 
    end 
    end 
end 

то место, куда вы хотите сделать (я думаю, что ваш, вероятно, в вашем SitemapController):

в приложение/контроллеры/sitemap_controller.rb

class SitemapController < ApplicationController 
    include ViewCacher 

    # action to render the cached view 
    def index 
    #sitemap is a string containing the rendered text from the partial located on 
    #the disk at Rails::Configuration.new.view_path 

    # you really wouldn't want to do this, I'm just demonstrating that the cached 
    # render and the uncached render will be the same format, but the data could be 
    # different depending on when the last update to the the Songs table happened 
    if params[:cached] 
     @songs = Song.all 

     # cached render 
     render :text => sitemap 
    else 
     # uncached render 
     render 'sitemap/sitemap', :songs => @songs 
    end 
    end 
end