2015-02-04 9 views
9

मैं एक दृश्य का उपयोग कर एक HTML स्ट्रिंग बनाने की कोशिश कर रहा हूं। मैं इसे एक कक्षा से प्रस्तुत करना चाहता हूं जो नियंत्रक नहीं है। मैं नियंत्रक के बाहर रेल रेंडरिंग इंजन का उपयोग कैसे कर सकता हूं? एक्शनमेलर कैसे करता है इसके समान?रेल: बाहरी नियंत्रक से दृश्य प्रस्तुत करें

धन्यवाद!

उत्तर

2

भविष्य में संदर्भ के लिए, मैं इस आसान मणि करता है कि खोजने समाप्त हो गया है कि यह एक हवा:

https://github.com/yappbox/render_anywhere

+0

संदर्भित लाइब्रेरी 2015 से अपडेट नहीं की गई है और रेल 4 और 5 के साथ असंगत है। – coreyward

1

तकनीकी रूप से, ActionMailerAbstractController::Base का उप-वर्ग कार्यान्वयन है। यदि आप इस कार्यक्षमता को अपने आप लागू करना चाहते हैं, तो आप शायद AbstractController::Base से भी उत्तराधिकारी बनना चाहेंगे।

यहां एक अच्छा ब्लॉग पोस्ट है: https://www.amberbit.com/blog/2011/12/27/render-views-and-partials-outside-controllers-in-rails-3/ जो आवश्यक चरणों को बताता है।

+0

यही वह है जिसे मैं ढूंढ रहा था, धन्यवाद! – prajo

0

"मैं एक दृश्य का उपयोग कर एक HTML स्ट्रिंग बनाने की कोशिश कर रहा हूं।" - यदि आपका मतलब है कि आप एक दृश्य टेम्पलेट के संदर्भ में हैं, तो बस एक सहायक विधि का उपयोग करें या आंशिक प्रस्तुत करें।

आप कुछ अन्य "सादा पुराना रूबी ऑब्जेक्ट" में रहे हैं, तो ध्यान में रखना है कि आप सीधे ERB मॉड्यूल का उपयोग करने के लिए स्वतंत्र हैं:

erb = ERB.new("path/to/template") 
result = erb.result(binding) 

चाल हो रही है कि 'बंधन' उद्देश्य यह है कि टेम्पलेट में कोड के लिए संदर्भ देता है। एक्शनकंट्रोलर और अन्य रेल कक्षाएं इसे मुफ्त में उजागर करती हैं, लेकिन मुझे कोई संदर्भ नहीं मिला जो बताता है कि यह कहां से आता है।

http://www.ruby-doc.org/stdlib-2.2.0/libdoc/erb/rdoc/ERB.html#method-i-result

0
बेस्ट

, एक नियंत्रक का उपयोग दृश्य प्रस्तुत करने के लिए के रूप में है कि वे क्या 'है के लिए, और फिर इसे एक स्ट्रिंग में परिवर्तित करें, क्योंकि यह आपका अंतिम लक्ष्य है।

require 'open-uri' 
html = open(url, &:read) 
+0

कृपया एकाधिक प्रश्नों के समान उत्तरों को पोस्ट न करें। एक अच्छा जवाब पोस्ट करें, फिर डुप्लिकेट के रूप में अन्य प्रश्नों को बंद करने के लिए वोट/ध्वज दें। यदि प्रश्न डुप्लिकेट नहीं है, * प्रश्न के उत्तर दें। * – durron597

23

आप इसे प्राप्त करने के लिए ActionView::Base का उपयोग कर सकते हैं।

view = ActionView::Base.new(ActionController::Base.view_paths, {}) 
view.render(file: 'template.html.erb') 

ActionView::Base इनिशियलाइज़ लेता है:

  1. एक संदर्भ, टेम्पलेट खोज पथ
  2. एक assigns हैश का प्रतिनिधित्व करने, टेम्पलेट

के लिए चर उपलब्ध कराने आप करना चाहते हैं हेल्पर्स शामिल करें, आप उन्हें शामिल करने के लिए class_eval का उपयोग कर सकते हैं:

view.class_eval do 
    include ApplicationHelper 
    # any other custom helpers can be included here 
end 
+1

एक्शन व्यू का उपयोग :: बेस सबसे अच्छा जवाब है, आईएमओ। मैं शायद एक छोटा कदम आगे जाऊंगा और सुविधा के लिए इसे उपclass करूँगा, लेकिन यह सिर्फ मुझे है। मैंने कभी भी वर्णन करने के लिए सार कंट्रोलर नहीं प्राप्त किया है, लेकिन शायद रेल का मेरा संस्करण बहुत हालिया है। किसी भी तरह से, इस तरह कम गंदा लगता है। – Ravenstine

+1

नेस्टेड लेआउट के बारे में क्या? –

3

बहुत सारे रत्नों के साथ अपने ऐप को फटकारने की आवश्यकता नहीं है। जैसा कि हम जानते हैं कि ईआरबी पहले से ही आपके रेल ऐप में शामिल है।

@jdf = JDF.new 
@job = ERB.new(File.read(Rails.root + "app/views/entries/job.xml.erb")) 
result = @job.result(binding) 

ऊपर एक ऐप के कोड का स्निपेट है जिस पर मैं काम कर रहा हूं।

  • @jdf एक वस्तु erb ध्यान में रखते हुए मूल्यांकन किया जाना है।
  • मेरे मामले में मुझे xml प्रस्तुत करने की आवश्यकता थी।
  • result सहेजने या कहीं भी भेजे जाने के लिए एक स्ट्रिंग है।

    rendered_string = ApplicationController.render(
        template: 'users/show', 
        assigns: { user: @user } 
    ) 
    

    यह app/views/users/show.html.erb renders और @user उदाहरण चर सेट ताकि आप की जरूरत नहीं है:

+0

यह तब तक अच्छा है जब तक कि आप 'link_to' आदि जैसे मददगार पर निर्भर न हों – unflores

18

रेल 5 अब एक बहुत अधिक सुविधाजनक तरीके से एक अनुरोध बनाने हैंडल और whatnot पर्दे के पीछे में इस का समर्थन करता है अपने टेम्पलेट में कोई भी बदलाव करने के लिए। यह स्वचालित रूप से ApplicationController (application.html.erb डिफ़ॉल्ट रूप से निर्दिष्ट लेआउट का उपयोग करता है)।

The test shows a handful of additional options and approaches.

+0

यह बहुत अच्छा है, फॉलो-अप के लिए धन्यवाद! – prajo

+0

यदि कोई नियंत्रक के बिना टेक्स्ट जेनरेट करना चाहेगा, तो इसके लिए देखें: http://ruby-doc.org/stdlib-2.4.2/libdoc/erb/rdoc/ERB.html#method-c-new इसके साथ, आपको 'दृश्य' निर्देशिका के अंदर तर्क बनाने की आवश्यकता नहीं है। –

+0

@EduardoSantana यह बहुत अच्छा है यदि आपके पास एक सादा ईआरबी टेम्पलेट है जिसे आप प्रस्तुत करना चाहते हैं, लेकिन यह एक्शन व्यू दृश्य प्रस्तुत नहीं करेगा। यानी, आपको इंस्टेंस वैरिएबल, आंशिक प्रतिपादन, सहायक विधियां इत्यादि नहीं मिलती हैं। – coreyward

संबंधित मुद्दे

 संबंधित मुद्दे