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




ruby-on-rails parameters (7)

मेरे पास मेरे ऐप में एक विशिष्ट खोज सुविधा है जो परिणामों की एक सूची लौटाती है जिसे पृष्ठांकित, सॉर्ट किया जा सकता है, जिसे एक अलग 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 सहायक के साथ यह करने के लिए एक आसान तरीका है या मैं किसी भी तरह पिछले अनुरोध से क्वेरी स्ट्रिंग को पार्स और पुन: उत्पन्न करने की आवश्यकता है?


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

थोड़ा देर से मुझे पता है ।।

यदि आपके द्वारा खोज परिणामों को फ़िल्टर करने के तरीके के रूप में इसका उपयोग किया जाता है, तो मेरी सहायक पर एक नज़र है :)

यह स्वचालित रूप से सभी खाली और अनियोजित पार्म्स को हटा देता है और वर्ग को "चयनित" जोड़ देता है यदि यह सभी नए पैरा पहले से सेट थे।

def search_to s, args={}

  selected = 0
  args.each do |k, v|
    selected = selected + 1 if params[k] == v.to_s || ( params[k].nil? && v.blank? )
  end

  if @search_params_base.nil?
    @search_params_base = request.parameters.clone
    @search_params_base.delete(:action)
    @search_params_base.delete(:controller)
    @search_params_base.delete(:page)
    @search_params_base.delete_if{|k, v| v.nil? || v.blank?}
    @search_params_base.delete(:utf8) if @search_params_base[:keywords].nil?
  end
  search_params = @search_params_base.merge(args)
  search_params.delete_if{|k, v| v.nil? || v.blank?}

  link_to s, search_path + '?' + search_params.to_param, :class => selected == args.length ? 'selected' : nil
end

तब आप इसे अपने विचार में उपयोग कर सकते हैं:

search_to '$80 to $110', :price => 80..110

या आपके मामले में:

search_to '30 per page', :page => params[:page], :per_page => 30

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

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

link_to 'Link', request.query_parameters.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

यदि आप मौजूदा परमेश्‍वर को रखना चाहते हैं और अपने आप को 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) %>

व्हाट अबाउट

<%= link_to 'Whatever', :overwrite_params => { :pear_page => 20 } %>

?





helpers