2011-01-26 6 views
34

डिफ़ॉल्ट रूटिंग के साथ, अनुरोध/पोस्ट /: आईडी :format => "html" के साथ "शो" कार्रवाई में मैप हो जाता है। मैं अपने शो एक्शन में कुछ एक्सएचटीएमएल तत्वों का उपयोग कर रहा हूं जो सही ढंग से प्रस्तुत नहीं होते हैं जब तक कि: content_type xml पर सेट नहीं होता है। मैं वर्तमान में show.xml.erb प्रतिपादन और content_type मैन्युअल स्थापना के रूप में निम्न प्रकार से इस चारों ओर हो रही है:रेल में किसी रूट के लिए डिफ़ॉल्ट प्रारूप कैसे सेट करें?

format.html { render :template => "/posts/show.xml.erb", 
      :locals => {:post => @post}, :content_type => "text/xml" } 

यह हालांकि मूर्खतापूर्ण लगता है। मैं routes.rb कैसे बदल सकता हूं ताकि/पोस्ट/आईडी आईडी format=>"xml" के साथ हो? धन्यवाद।

+0

आपका प्रश्न मॉडल के बारे में भ्रमित है: क्या आपके पास प्लॉट या पोस्ट हैं? – tomeduarte

+0

ओह, क्षमा करें। इसका एक मॉडल, इसे पोस्ट करें। – Saucerful

उत्तर

76

डिफ़ॉल्ट प्रारूप:

आप सेट कर सकते हैं डिफ़ॉल्ट हैश का उपयोग कर xml को दिए गए रूट का डिफ़ॉल्ट प्रारूप।

उदाहरण:

# single match defaulting to XML (/plots/1 is the same as /plots/1.xml) 
match 'posts/:id' => 'posts#show', :defaults => { :format => 'xml' } 

# using resources, defaulting to XML (all action use XML by default) 
resources :posts, :defaults => { :format => 'xml' } 

# using resources and mixing with other options 
resources :posts, 
      :only => [:new, :create, :destroy], 
      :defaults => { :format => 'xml' } 

यह हमेशा official Ruby on Rails routing guide खोज करने के लिए एक अच्छा विचार है, यह में गहराई से काफी है और किसी भी मार्ग मुद्दों के लिए एक बहुत अच्छा प्रथम पड़ाव संसाधन।

+9

आप नामस्थान के लिए डिफ़ॉल्ट प्रारूप भी सेट कर सकते हैं और इस प्रकार: 'नामस्थान: उपयोगकर्ता,: डिफ़ॉल्ट => {: प्रारूप => 'जेसन'}' –

+0

बहुत बढ़िया। उपरोक्त के रूप में सेट प्रारूप के बिना, मुझे 406 त्रुटियां एक्सएमएल का अनुरोध कर रही थीं, भले ही बाकी सब कुछ नियंत्रक में ठंडा हो। – Polsonby

19

आप केवल एक प्रारूप का समर्थन और कहा कि प्रारूप के रूप में सभी अनुरोधों को इलाज के लिए चाहते हैं, आप इसे बदलने के लिए एक फिल्टर इस्तेमाल कर सकते हैं:

अनुरोधों के लिए
before_filter :set_format 

def set_format 
    request.format = 'xml' 
end 
+0

क्या यह कोड नियंत्रक में जाता है? – Saucerful

+1

हां। यदि आप मार्गों के बजाय इस समाधान का उपयोग करना चुनते हैं (मेरा उत्तर देखें), तो आपको प्रति सुरक्षा चिंताओं के अनुसार फ़िल्टर को एक निजी विधि के रूप में सेट करना चाहिए। - ध्यान दें कि यह प्रारूप को मजबूर करता है जहां मार्ग मार्ग नहीं है, बस डिफ़ॉल्ट सेट करता है। – tomeduarte

6

रेल 5: के बजाय उपयोग before_filterbefore_action

before_action :set_default_request_format 

    def set_default_request_format 
    request.format = :json unless params[:format] 
    end 

के लिए रेल 4 और बड़ी उम्र: अपने नियंत्रक में (जैसे ApplicationController अगर सब पूरे आवेदन एक ही प्रारूप का उपयोग करता है) के बाद जोड़ें।

2

मैं रेल 5 में अजीब व्यवहार की खोज कर रहा हूँ अगर आप इस का उपयोग करें:

{ format: :json } 

अपने config/routes.rb में तो भले ही JSON अपने को स्वीकार शीर्षक में सेट नहीं है, यह अभी भी एक JSON अनुरोध करने के लिए अनुरोध coerces , जिसमें नियंत्रक परीक्षण शामिल हैं जिनमें as: :html विकल्प सेट है। यह वास्तव में मेरे लिए एक बड़ा सौदा नहीं है, इसलिए मैं यह क्यों खोला नहीं जा रहा हूं कि यह क्यों है, लेकिन अगर कोई इसे समझता है, तो मुझे बताएं और मैं यह जवाब अपडेट करूंगा।

+0

मैं यह वही चीज़ देख रहा हूं। बहुत परेशान – turboladen

0

आप एक मार्ग के लिए डिफ़ॉल्ट स्वरूप सेट करना चाहते हैं, defaults विकल्प का उपयोग:

resources :posts, constraints: lambda { |req| req.format = 'xml' } 
:

resources :posts, defaults: { format: 'xml' } 

लेकिन यदि आप किसी विशिष्ट प्रारूप वापस जाने के लिए हर अनुरोध को लागू constraints विकल्प का उपयोग करना चाहते हैं

प्रलेखन देखें: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

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