उस पोस्ट के लिंक के लिए रेल लिंक का उपयोग करना


85

मेरे पास एक लिंक है जिसके साथ मुझे पोस्ट अनुरोध सबमिट करना होगा। आम तौर पर, मैं jQuery का उपयोग करता हूं और लिंक के डिफ़ॉल्ट व्यवहार को रोकता हूं और फिर गंतव्य के लिए एक फॉर्म सबमिट करता हूं। ऐसा लगता है जैसे कुछ रेल को मेरी मदद करने में सक्षम होना चाहिए। निश्चित रूप से, link_toविधि में POST http विधि निर्दिष्ट करने के लिए एक विकल्प है:

link_to "Profile", 'http://example.com/profile', method: :post

यह काम करता है, लेकिन मुझे 2 मापदंडों को भी जोड़ना होगा। मैंने कोशिश की:

link_to "Profile", 'http://example.com/profile', method: post, param1: 'value1', param2: 'value2'

उन्होंने बस उन <a>तत्वों को HTML तत्व में जोड़ा है , लेकिन लिंक को क्लिक करने पर उन्हें सबमिट नहीं किया है:

<a rel="nofollow" param1="value1" param2="value2" data-method="post" href="http://example.com/profile">Profile</a>

वहाँ एक रास्ता है link_toया किसी अन्य रेल विधि का उपयोग कर मापदंडों के साथ एक पोस्ट अनुरोध करने के लिए है? मैं रेल का उपयोग कर रहा हूँ 3.2.9।


नहीं लगता कि आप ऐसा कर सकते हैं। शायद नेट / http या HTTParty के साथ अपने नियंत्रक में इसे करना सबसे अच्छा है?
माइक कैंपबेल

मेरे नियंत्रक में ऐसा नहीं कर सकते, उपयोगकर्ता को दूसरी साइट पर निर्देशित करने की आवश्यकता है। ऐसा लगता है कि आप सही हैं, मेरे लिए ऐसा करने के लिए अंतर्निहित लिंक तंत्र नहीं है।
पर।

जवाबों:


143

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

यदि दूसरी ओर आप क्वेरी मापदंडों का मतलब था , तो यह काम करेगा:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post

1
बस अपने प्रश्न को अपडेट किया, मैं वास्तव में इन लिंक के लिए एक बाहरी URL का उपयोग कर रहा हूं।
पर।

मैंने मूल रूप से एक नोट जोड़ा है कि आप जो करना चाहते हैं वह लिंक का उपयोग करके संभव नहीं है। आपको सबमिट बटन के साथ एक फॉर्म की आवश्यकता है।
क्रिस सैल्जबर्ग

3
यह नोट करना महत्वपूर्ण है कि यदि उपयोगकर्ता ने जावास्क्रिप्ट को निष्क्रिय कर दिया है तो लिंक "GET" अनुरोध पर डिफ़ॉल्ट हो जाएगा।
bkunzi01

8

आप URL में पैरामीटर को इस तरह से एन्कोड कर सकते हैं:

link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post

यदि यह आपकी आवश्यकताओं के अनुरूप नहीं है तो आप बेहतर फॉर्म का उपयोग कर रहे हैं link_to


यह वास्तव में मापदंडों को जोड़ने का एक बहुत अच्छा तरीका है।
नथ्नवाड़ा

मेरी जरूरतों के लिए काम नहीं करता है, मापदंडों को POST पैरामीटर होना चाहिए। लेकिन धन्यवाद, मैं to_param विधि के बारे में नहीं जानता था। आपको एक ?प्रोफ़ाइल के बाद की भी आवश्यकता है ।
पर।

ठीक है मैं समझता हूं, फिर मुझे लगता है कि आपको एक फॉर्म लिखना होगा। आप एक सहायक विधि लिख सकते हैं जो कई बार इस तर्क को दोहराने की आवश्यकता होने पर इस फॉर्म का निर्माण करेगी।
एड्रिएन कोक्वियो

1
इस बात के बावजूद कि यह ओपी के सवाल का जवाब नहीं देता है, आपको इसके लिए एक यूआरएल सहायक का उपयोग करना चाहिए, जैसा कि @ श्याओमा का जवाब है
बेन वेस्ट

@ बेनेवेस्ट: हेल्पर शुरू में इस्तेमाल नहीं किया गया था और मुझे लगा कि यह सार्थक है (उदाहरण के लिए यह एक बाहरी URL हो सकता है)
एड्रिएन कोक्विओ

3

ध्यान दें कि यदि उपयोगकर्ता ने JS अक्षम कर दिया है या आपने डिफ़ॉल्ट रूप से आने वाले विनीत JS पुस्तकालयों को हटा दिया है, तो link_toचुपचाप एक GETअनुरोध के माध्यम से प्रस्तुत किया जाएगा ।

सामान्य तौर पर, मैं उन लिंक के बहुत शौकीन नहीं हूं जो POSTअनुरोध करते हैं। मुझे लगता है कि यह एक रूप और एक बटन की भूमिका है।

इस प्रकार, एक आसान (और सुरक्षित) विकल्प रेल्स बटन_टो हेल्पर का उपयोग करना है :

button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')

button_tomethodविकल्प का भी समर्थन करता है, लेकिन जैसा कि यह चूक करता है postइसलिए मैंने इसे छोड़ दिया है।


कोस्तस से सहमत। इसके अलावा, link_to विधि पोस्ट इंटरनेट एक्सप्लोरर पर अच्छी तरह से काम नहीं करता है।
पियरे-यवेस ओ

1

POST डेटा के लिए, आपको एक फॉर्म की आवश्यकता है। हालाँकि, आपको सबमिट बटन की आवश्यकता नहीं है। यदि आप चाहते हैं कि यह किसी कारण के लिए एक लिंक की तरह दिखे, तो आप वास्तव में इसे एक लिंक बना सकते हैं जो जावास्क्रिप्ट के माध्यम से फ़ॉर्म को सबमिट करता है। नीचे दिए गए उदाहरण में, POST संसाधन एक REST क्रिया है जिसमें किसी भी फ़ील्ड की आवश्यकता नहीं होती है, इसलिए कोई प्रपत्र इनपुट नियंत्रण नहीं होते हैं। यदि आप कुछ डेटा पोस्ट करना चाहते हैं, तो फ़ॉर्म में छिपे इनपुट फ़ील्ड डालें।

<%= form_tag('http://something_postable', :method => :post, :class => 'internal') %></form>
<%= link_to_function('Label for Link', 'previous("form").submit()', :title => 'Hover text for link') %>

फ़ॉर्म को एक वर्ग सौंपा गया है ताकि आप इसे स्टाइल कर सकें या इसे सीएसएस के माध्यम से छिपा सकें (जैसे 'प्रदर्शन: इनलाइन')


1

पैरामीटर और http विधि एक साथ होनी चाहिए {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.