2010-04-12 19 views
10

मैं अपने साइटमैप कैश करने के लिए इतना है कि sitemap.xml के लिए अनुरोध हमेशा के लिए नहीं ले जाएगा एक रैक कार्य का उपयोग करना चाहते से render_to_string।एक रेक कार्य

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

मैं कैसे रैक के भीतर से एक स्ट्रिंग के लिए एक टेम्पलेट प्रदान कर सकते हैं यहाँ मैं अब तक राशि है?

+0

इस लेख है मददगार http://stackoverflow.com/questions/30725119/render-a -व्यू-ए-ए-रेक-टास्क –

उत्तर

9

यहां बताया गया है मैंने किया:

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) 

ध्यान दें कि मैं एक आंशिक करने के लिए मेरे टेम्पलेट परिवर्तित इस काम

+0

आप डिफ़ॉल्ट_url_options हैश का उपयोग कहां हैं? –

4

कैसे रेक कार्य से ActionView :: बेस के तरीकों और संदर्भ उपयोग करने में सक्षम होने के लिए के बारे में post नहीं है।

बहरहाल, यह एक monkeypatch है। कैशिंग को पूरा करने के लिए रेलों का cache mechanism का उपयोग क्यों न करें? :)

बाद में संपादित करें: render_to_string फ़ंक्शन एक्शनकंट्रोलर :: बेस संदर्भ में परिभाषित किया गया है।

नीचे कैसे यह रेक कार्य, 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} 
) 
) 
+0

कैश तंत्र बहुत अच्छा है, लेकिन कभी-कभी आप वास्तव में समय-समय पर फ़ाइल को ऑफ़लाइन सामग्री में उत्पन्न करना चाहते हैं। एक रेक कार्य उस के लिए एकदम सही जगह है - अच्छा लिंक। –

+0

मैं कैशिंग का उपयोग नहीं कर सकता क्योंकि मैं एक HTTP अनुरोध के जवाब में साइटमैप प्रस्तुत नहीं कर सकता क्योंकि इसमें 30 सेकंड से अधिक समय लगता है और 30 सेकंड –

+0

पर हेरोकू HTTP अनुरोधों को समाप्त करता है। आपके पास एक बिंदु है। तो, क्या चिपका हुआ लिंक से दृष्टिकोण आपके लिए काम करता है? –

1

बनाने के लिए हाल ही में मैं एक रेक कार्य परिभाषित होरेस लोएब की तरह उल्लेख ले जाना चाहते थे और इसे स्वयं निहित पृष्ठभूमि नौकरी में अनुवादित करें, लेकिन इसका आसानी से अनुवाद नहीं हुआ।

यहाँ रेल 2.3.x क्योंकि Rails 3 implementation मैंने पाया कार्य नहीं करेगा के लिए मेरे कार्यान्वयन है।

# Public: Template to render views outside the context of a controller. 
# 
# Useful for rendering views in rake tasks or background jobs when a 
# controller is unavailable. 
# 
# Examples 
# 
# template = OfflineTemplate.new(:users) 
# template.render("users/index", :layout => false, :locals => { :users => users }) 
# 
# template = OfflineTemplate.new(ProjectsHelper, PermissionsHelper) 
# template.render("projects/recent", :projects => recent_projects) 
# 
class OfflineTemplate 
    include ActionController::UrlWriter 
    include ActionController::Helpers::ClassMethods 

    # Public: Returns the ActionView::Base internal view. 
    attr_reader :view 

    # Public: Convenience method to 
    delegate :render, :to => :view 

    # Public: Initialize an offline template for the current Rails environment. 
    # 
    # helpers - The Rails helpers to include (listed as symbols or modules). 
    def initialize(*helpers) 
    helper(helpers + [ApplicationHelper]) 
    @view = ActionView::Base.new(Rails.configuration.view_path, {}, self) 
    @view.class.send(:include, master_helper_module) 
    end 

    private 

    # Internal: Required to use ActionConroller::Helpers. 
    # 
    # Returns a Module to collect helper methods. 
    def master_helper_module 
    @master_helper_module ||= Module.new 
    end 
end 

यह एक गिस्ट के रूप में उपलब्ध है: https://gist.github.com/1386052

तो फिर तुम एक OfflineTemplate बनाने के लिए ऊपर वर्ग का उपयोग कर सकते एक रेक कार्य में अपने विचार प्रस्तुत करने के लिए:

task :recent_projects => :environment do 
    template = OfflineTemplate.new(ProjectsHelper, PermissionsHelper) 
    puts template.render("projects/recent", :projects => recent_projects) 
end 
संबंधित मुद्दे