2010-09-07 4 views
12

में दिखाने मैं वर्तमान दृश्य में एक LINK_TO सहायक का उपयोग कर रहा शीर्षक, लेखक, image_url जैसे पैरामीटर पारित करने के लिए पैरामीटर के बिना LINK_TO साथ नियंत्रक और नियंत्रक करने के लिए वापस isbn को देखने से मानकों को पारित करने के लिएरूबी: कैसे यूआरएल

<%= link_to 'Sell this item',new_item_path(:title => title, :author => authors, :image_url=>image, :image_url_s=>image_s, :isbn=>isbn, :isbn13=>isbn13) %> 

नियंत्रक फिर बाद में देखें में एक फार्म के द्वारा इस्तेमाल किया जा करने के लिए एक वस्तु के लिए मानकों को प्रदान करेंगे (new.html.erb में)

def new 
     @item = Item.new 

     @item.title = params[:title] 
     @item.author = params[:author] 
     @item.image_url = params[:image_url] 
     @item.image_url_s = params[:image_url_s] 
     @item.isbn = params[:isbn] 
     @item.isbn13 = params[:isbn13] 

     respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @item } 
     end 
end 

new.html.erb तो कहा जाएगा। यह सब काम कर ठीक है पर यूआरएल सभी मापदंडों

http://localhost:3000/items/new?author=Michael+Harvey&image_url=http://ecx.images-amazon.com/images/I/51vt1uVjvLL._SL160_.jpg&image_url_s=http://ecx.images-amazon.com/images/I/51vt1uVjvLL._SL75_.jpg&isbn13=9780307272508&isbn=0307272508&title=The+Third+Rail 

वहाँ किसी भी तरह से मैं पैरामीटर बना सकते हैं यूआरएल पर दिखाई नहीं है पता चलता है?

+0

आपको इसकी आवश्यकता क्यों है? ये पैरामीटर कहां से आता है? क्या यह उपयोगकर्ता इनपुट से या कहां से है? जैसा कि मैंने इसे देखा, ऐसा लगता है कि आप एक अजीब तरीके से कुछ कर रहे हैं। कृपया बताएं कि आप ऐसा क्यों कर रहे हैं, क्योंकि शायद एक बेहतर तरीका है। – klew

+0

ये पैरामीटर अमेज़ॅन द्वारा एक्सएमएल स्वरूपित आउटपुट में लौटाए जाते हैं। मेरे पास एक खोज बार है जो उपयोगकर्ता को अमेज़ॅन डेटाबेस (अमेज़ॅन ईसीएस का उपयोग करके) से पूछताछ करने की अनुमति देता है। प्रत्येक क्वेरी के बाद, मेरी साइट तालिका में आउटपुट से पहले दस आइटमों को पॉप्युलेट करेगी। प्रत्येक आइटम में एक बटन होगा जो उपयोगकर्ता को उस आइटम को बेचने के लिए चुनने की अनुमति देता है। मुझे इन पैरामीटरों को किसी अन्य रूप में किसी रूप में प्रदर्शित करने की आवश्यकता है। अंततः इन पैरामीटर को मेरे डेटाबेस में सहेजा जाएगा। कारण मुझे दिखाए गए पैरामीटर पसंद नहीं हैं कि उपयोगकर्ता मैन्युअल रूप से यूआरएल में हेरफेर कर सकता है। – user1994764

+0

ऐसा नहीं लगता है कि उपयोगकर्ता से छिपाने वाले पैरामीटर आपकी समस्या का समाधान करने जा रहे हैं। दुर्भावनापूर्ण उपयोगकर्ता हमेशा पैरामीटर ढूंढने और उन्हें कुशल बनाने में सक्षम होंगे। अपने दृष्टिकोण को लागू करके आप कोड को और अधिक जटिल बनाते हैं लेकिन यह वास्तव में किसी भी तरह से सुरक्षा में सुधार नहीं करता है – paulus

उत्तर

2

पास दो विकल्प है कि मैं देख सकता हूँ और दोनों जावास्क्रिप्ट को शामिल कर रहे हैं:

  • लिंक मापदंडों के लिए गुप्त फ़ॉर्म खानों को भरने के लिए और फिर एक HTTP पोस्ट अनुरोध
  • लिंक सबमिट है का उपयोग कर प्रपत्र सबमिट है नियंत्रक कार्रवाई के लिए एक AJAX अनुरोध (एक HTTP GET का उपयोग करते हुए जब तक कि लिंक पर क्लिक न हो, सर्वर-साइड स्टेटस बदलता है, जिस स्थिति में POST का उपयोग किया जाना चाहिए)

मुझे लगता है कि मैं दूसरे दृष्टिकोण के साथ जाऊंगा।

4

यूआरएल से बाहर और अनुरोध में पैरामीटर को स्थानांतरित करने के लिए एक पोस्ट का उपयोग किया जा सकता है, लेकिन यह "सही" या सर्वोत्तम अभ्यास नहीं है। HTTP मानकों ऐसे हैं कि गैर-जीईटी अनुरोध केवल उन अनुरोधों के लिए उपयोग किए जाते हैं जो सर्वर पर स्थिति बदलते हैं। यही कारण है कि जब आप किसी पोस्ट के जवाब में उत्पन्न हुए पृष्ठ को रीफ्रेश करते हैं तो आपको चेतावनी मिलती है।

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

मुझे लगता है कि आपकी "नई" कार्रवाई रीस्ट-स्टाइल है, जिसमें यह एक ऐसा फॉर्म उत्पन्न कर रहा है जिसे सर्वर पर राज्य बदलने के लिए सबमिट करना होगा। इसलिए आपके विकल्प हो सकते हैं:

  1. पोस्ट का उपयोग करें, भले ही यह मानक अनुपालन न हो। सिफारिश नहीं की गई।
  2. AJAX GET का उपयोग करें। इसके लिए जावास्क्रिप्ट की आवश्यकता है, और AJAX हैंडलिंग एक जेएस ढांचे और परीक्षण के उपयोग जैसे आवश्यकताओं को जोड़ता है।
  3. जीईटी (या POST) का उपयोग करें, लेकिन पैरामीटर को कैप्चर करें और उन्हें स्टोर करें, उपयोगकर्ता को वापस एक अन्य स्वच्छ यूआरएल पर रीडायरेक्ट करें जो संग्रहीत मूल्य प्रदर्शित करता है। आप सत्र हैश में उनको स्टोर कर सकते हैं, या उनमें से एक डेटाबेस रिकॉर्ड बना सकते हैं। असल में आपको वास्तव में इस मामले में POST का उपयोग करना चाहिए, क्योंकि आप उन पैरामीटर को संग्रहीत करके सर्वर पर प्रभावी ढंग से राज्य बदल रहे हैं। इस मामले में, यदि उपयोगकर्ता पृष्ठ को रीफ्रेश करता है तो उसे निर्देशित किया जाता है, तो उन पैरामीटर संरक्षित किए जाएंगे। यह ताज़ा करने पर ब्राउज़र चेतावनी को प्रभावी ढंग से हटा देता है, जो कुछ मैं निश्चित रूप से सराहना कर सकता हूं।
7

शायद आप पैरामीटर को एन्कोड कर सकते हैं और उन उपयोगकर्ताओं को रोकने के लिए नियंत्रक में डीकोड कर सकते हैं जो यूआरएल को संशोधित करना चाहते हैं? शायद अधिक हो सकता है लेकिन ...

>> author=ActiveSupport::Base64.encode64("author=jim") 
=> "YXV0aG9yPWppbQ==\n" 
>> ActiveSupport::Base64.decode64(author) 
=> "author=jim" 
0

उन्हें सत्र में क्यों नहीं लिखें? ऐसा लगता है कि आपके पास डेटा में 4k से कम हो सकता है। बस इसे मिटा देना याद रखें।