2010-06-18 7 views
0

J'essaie de résumer la logique pour générer mon plan du site dans une catégorie distincte pour que je puisse utiliser retardé :: Job pour générer hors bande:Problème rendu d'une vue à l'intérieur d'une classe générique

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 

Mais chaque fois que j'essaie ViewCacher.new.cache_sitemap je reçois cette erreur:

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: 

Je suppose que cela signifie que ActionController::UrlWriter ne sont pas inclus dans le bon endroit, mais je ne sais vraiment pas

Répondre

0

Est-ce que cela fait ce que vous essayez de faire? Ceci n'est pas testé, juste une idée.

dans 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 

alors où vous voulez rendre (je pense que votre probablement dans votre SitemapController):

dans app/controllers/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