2010-01-30 12 views
6

के साथ नामित मार्गों का उपयोग करके मैं रेल में एक साधारण खोज फ़ॉर्म बनाने की कोशिश कर रहा हूं, लेकिन मुझे लगता है कि मुझे कुछ याद आ रही है।पैरामीटर और form_tag

map.search ":first_name/:last_name", :controller => "home", :action => "search" 

मैं उपयोग करने के लिए है कि मेरी खोज के रूप में कोशिश कर रहा हूँ:

<% form_tag(search_path, :method => 'get') do %> 
    <%= text_field_tag(:first_name) %> 
    <%= text_field_tag(:last_name) %> 
    <%= submit_tag("Search") %> 
<% end %> 

लेकिन जब मैं खोज प्रपत्र लोड मैं एक ActionController मिल

मैं खोज के लिए एक नामित मार्ग है :: रूटिंग एरर:

search_url failed to generate from {:action=>"search", :controller=>"home"} - you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: [:first_name, :last_name] - are they all satisfied?

मुझे क्या याद आ रही है? मैंने सोचा कि मेरे रूप में परिभाषित फ़ील्ड स्वचालित रूप से मेरे मार्ग पैरामीटर से जुड़े होंगे। : -/

अद्यतन:

मैं समझता हूँ से पहले फॉर्म अब प्रदर्शित किया जाता है कि search_path उत्पन्न होता है, तो यह अद्यतन नहीं किया जा सकता है। अंधेरे में स्पष्ट!

मैं अपने मार्गों बदल दिया है:

map.search 'search', :controller => "home", :action => "search" 
map.name ':first_name/:last_name', :controller => "home", :action => "name" 

और अब search कार्रवाई सिर्फ करता है:

def search 
    redirect_to name_path(params) 
end 

यह सब एक इलाज काम करता है! यहां मुख्य लक्ष्य नाम नाम से उस URL को खोज करने के परिणामस्वरूप रूट प्राप्त कर रहा था। धन्यवाद दोस्तों!

उत्तर

4

form_for प्रपत्र उत्पन्न करता है और यह सभी मापदंडों कि search_path बनाने के लिए की जरूरत है निर्दिष्ट किया है करने के लिए है, इसलिए यह तरह दिखना चाहिए:।

<% form_tag(search_path, :firstname => 'some_text', :lastname => 'some_text', :method => 'get') do %> 

या कम से कम कुछ इस तरह। एचटीएमएल टैग form में पैरामीटर action='/some/url' है और यही कारण है कि आपको search_path के लिए सभी पैरामीटर निर्दिष्ट करना होगा।लेकिन जैसा कि आप उम्मीद करते हैं उपरोक्त उदाहरण काम नहीं करेगा।

तो आप क्या कर सकते हैं?

  1. है कि action='/' खाली फ़ॉर्म बनाएं और जे एस के साथ प्रस्तुत करने से पहले अपने इनपुट पाठ फ़ील्ड की सामग्री के साथ बदलें।

  2. उदाहरण के लिए /search पर एक और मार्ग बनाएं जो सबमिट से पैरामीटर प्राप्त करता है और फिर पथ को सही करने के लिए रीडायरेक्ट करता है।

शायद वहाँ भी यह करने के लिए कुछ बेहतर तरीके है;)

+0

मुझे अभी यह आपके विकल्प # 2 के साथ काम मिला है - मैंने एक और मार्ग और दूसरी कार्रवाई बनाई है। धन्यवाद! –

+0

शायद यह दोनों तरीकों से करना बेहतर होगा। तो इसे करें 2. डिफ़ॉल्ट रूप से रास्ता और यदि जेएस काम कर रहा है तो जेएस के साथ 'एक्शन' बदलें - ताकि यह रीडायरेक्ट किए बिना काम कर सके। – klew

2

पहला, search_path वास्तव में एक विधि है, जो विकल्पों का एक हैश लेता है। यह विधि है जो :first_name और :last_name प्राप्त करनी चाहिए।

दूसरा, ब्राउज़र केवल POST अनुरोध के निकाय के रूप में फॉर्म पैरामीटर सबमिट कर सकता है, या क्वेरी स्ट्रिंग पैरामीटर (किसी भी प्रकार की अनुरोध विधि के लिए)। तो दुर्भाग्य से ऐसा कोई तरीका नहीं है कि ब्राउज़र का मूल सबमिट फ़ंक्शन उस प्रकार का यूआरएल उत्पन्न कर सकता है।

इसके बारे में सोचने का एक और तरीका: आप यहां क्या कर रहे हैं एक यूआरएल के साथ फॉर्म टैग की एक्शन विशेषता भर रहा है। जब आप फॉर्म बना रहे हैं तो रेल को एक पूर्ण यूआरएल चाहिए। इसलिए अगले पोस्ट अनुरोध के बजाए फ़ॉर्म हेल्पर कहलाए जाने पर आपके रूट के सभी पैरामीटर निर्दिष्ट किए जाने की आवश्यकता है।

तो दुर्भाग्य से, आप जो करना चाहते हैं वह सामान्य रेल एप्लिकेशन में संभव नहीं है।

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

+0

यह एक HTML फ़ॉर्म HTTP GET पैरामीटर प्रस्तुत करने के लिए के लिए पूरी तरह से संभव है। उदाहरण के लिए, Google पर खोज करते समय URL पर नज़र डालें। –

+0

लेकिन वह जो करने का प्रयास कर रहा है वह * क्वेरी स्ट्रिंग * पैरामीटर नहीं है, वे यूआरएल के पथ का हिस्सा हैं। –

+0

क्षमा करें, मैंने सवाल को गलत तरीके से पढ़ा। –

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