ruby on rails - रेलें: link_to में GET क्वेरी स्ट्रिंग मापदंडों का संरक्षण




ruby-on-rails parameters (6)

मेरे पास मेरे ऐप में एक विशिष्ट खोज सुविधा है जो परिणामों की एक सूची लौटाती है जिसे पृष्ठांकित, सॉर्ट किया जा सकता है, जिसे एक अलग record_per_page मान के साथ देखा जा सकता है, आदि इनमें से प्रत्येक विकल्प क्वेरी स्ट्रिंग में मापदंडों द्वारा नियंत्रित किया जाता है। एक सरल उदाहरण:

/search?q=test&page=2

अब कहते हैं कि मुझे 10_, 20, 30 के रिकॉर्ड_पर_पेज मान सेट करने वाले लिंक का एक सेट प्रदर्शित करने की आवश्यकता है। प्रत्येक लिंक में मौजूदा क्वेरी पैरामीटर शामिल होना चाहिए, जो बहुत लंबा सेट हो सकता है, साथ ही एक नया per_page पैरामीटर भी हो सकता है।

/search?q=test&page=2& ... &per_page=10
/search?q=test&page=2& ... &per_page=20
/search?q=test&page=2& ... &per_page=30

वहाँ सिर्फ link_to सहायक के साथ यह करने के लिए एक आसान तरीका है या मैं किसी भी तरह पिछले अनुरोध से क्वेरी स्ट्रिंग को पार्स और पुन: उत्पन्न करने की आवश्यकता है?


आप बस params हैश के तत्वों को link_to पर फेंक सकते हैं। पसंद

link_to "some_other_link", "/search", :page => params[:page]

क्वेरी पैरामीटर के साथ नए पैरामीटर को मर्ज करने का सबसे सरल तरीका और सभी मापदंडों के साथ नहीं (पथ के माध्यम से प्राप्त सहित) अनुरोध के साथ विलय करना है ।query_parameters

link_to 'Search', search_path(request.query_parameters.merge({ per_page: 20 }))

अन्यथा आप पथ मापदंडों को दोहराते हुए क्वेरी स्ट्रिंग के साथ समाप्त होते हैं, उदाहरण के लिए ?action=index&controller=products&foo=bar बजाय ?foo=bar


यदि आप मौजूदा परमेश्‍वर को रखना चाहते हैं और अपने आप को XSS हमलों के लिए उजागर नहीं करना चाहते हैं, तो परम हैश को साफ करना सुनिश्चित करें, केवल उन पारमों को छोड़ दें जिन्हें आपका ऐप भेज रहा है:

# inline
<%= link_to 'Link', params.slice(:sort).merge(per_page: 20) %>

यदि आप इसे कई स्थानों पर उपयोग करते हैं, तो कंट्रोलर में दिए गए पैरामन्स को साफ करें:

# your_controller.rb
@params = params.slice(:sort, :per_page)

# view
<%= link_to 'Link', @params.merge(per_page: 20) %>

यह काम करता है यदि आपके द्वारा संसाधित किए जा रहे लिंक आपको request.params द्वारा नहीं दिए गए हैं।

require 'rack/utils'                                                                                
require 'uri'                                                                                       

def modify_query url, options={}                                                                    
  uri = URI(url)                                                                                    
  query_hash = Rack::Utils.parse_query(uri.query)                                                   
  query_hash.merge!(options)                                                                        
  uri.query = Rack::Utils.build_query(query_hash)                                                   
  uri.to_s                                                                                          
end                                                                                                 

puts modify_query('/search?q=test&page=2&per_page=10', 'per_page' =>  20)                           
puts modify_query('/search?q=test&page=2', 'per_page' => 30)                                        

# Outputs                                                                                           
# /search?q=test&page=2&per_page=20                                                                 
# /search?q=test&page=2&per_page=30

link_to 'Link', params.merge({:per_page => 20})

link_to 'Link', request.query_parameters.merge({:per_page => 20})




helpers