जब मैंने नमूना कोड में यह कोशिश की, तो मैं क्या देख पा रहा था कि क्वेरी पैरामीटर (जीईटी) को पोस्ट बॉडी से प्राथमिकता दी गई है। इसलिए, मैं Rack
के कोड में खोद गया जो रेल में HTTP अनुरोधों को संभालता है।यहाँ request.rb
# Returns the data recieved in the query string.
def GET
....
end
# Returns the data recieved in the request body.
#
# This method support both application/x-www-form-urlencoded and
# multipart/form-data.
def POST
....
end
# The union of GET and POST data.
def params
@params ||= self.GET.merge(self.POST)
rescue EOFError
self.GET
end
यहाँ, विधि से कोड है
- प्राप्त करें - एक हैश प्रारूप में क्वेरी पैरामीटर रिटर्न
- पोस्ट - एक हैश प्रारूप में पोस्ट शरीर रिटर्न
तो, params
के कोड के अनुसार, GET पैरामीटर को समान कुंजी के मामले में POST पैरामीटर द्वारा ओवरराइड किया जाना चाहिए। (self.GET.merge(self.POST)
)। लेकिन, जब मैंने व्यावहारिक रूप से कोशिश की तो मुझे यह मिला कि इसके विपरीत क्या है।
तो, एकमात्र मौका यह है कि इस कोड को रेल द्वारा ओवरराइड किया जा रहा है। जब मैंने इसके बारे में सोचा, तो यह सही समझ में आया क्योंकि रेल से params
हैश में हमेशा "controller"
और "action"
कुंजी शामिल होंगी, जो रैक के मामले में अनुपस्थित होंगी। इसलिए, मैंने रेल के कोड को भी देखा, और पाया कि params
विधि वास्तव में ओवरराइड की जा रही थी। रेल स्रोत कोड में request.rb और parameters.rb पर एक नज़र डालें। parameters.rb में, हमने:
# Returns both GET and POST \parameters in a single hash.
def parameters
@env["action_dispatch.request.parameters"] ||= begin
params = request_parameters.merge(query_parameters)
params.merge!(path_parameters)
encode_params(params).with_indifferent_access
end
end
alias :params :parameters
और request.rb में:
# Override Rack's GET method to support indifferent access
def GET
@env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
end
alias :query_parameters :GET
# Override Rack's POST method to support indifferent access
def POST
@env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
end
alias :request_parameters :POST
तो, यहाँ
- query_parameters - POST पद्धति के लिए अन्य नाम - GET विधि
- REQUEST_PARAMETERS के लिए उर्फ
- path_parameters - विधि जो ret ret
params
के लिए उर्फ (यहां यह ओवरराइड की गई थी)
नोट मिलता है विधि और POST पद्धति भी अधिरोहित किए गए थे, मुख्य रूप से हैश एक को लौट कन्वर्ट करने के लिए - नियंत्रक और कार्रवाई एक हैश
पैरामीटर के रूप में अनुरोध के लिए urns हैशविथ इंडिफरेंस एक्सेस का ऑब्जेक्ट। तो, यहां कोड को देखकर (params = request_parameters.merge(query_parameters)
), यह स्पष्ट हो जाता है कि पोस्ट पैरामीटर रेल में समान कुंजी के मामले में जीईटी पैरामीटर द्वारा ओवरराइड किए जाते हैं। या दूसरे शब्दों में, पोस्ट पैरामीटर पर जीईटी पैरामीटर प्राथमिकता दी जाती है।
जासूस काम के लिए बहुत बहुत धन्यवाद! – cofiem
जोड़ा गया नोट कि आप नियंत्रक विधि में 'ActionDispatch :: Request' ऑब्जेक्ट तक पहुंच प्राप्त कर सकते हैं: किसी भी नियंत्रक विधि से 'request.query_parameters' और' request.request_parameters' आपको टाइप करके अलग-अलग पैरा प्राप्त करेंगे। – keaplogik
@keaplogik जो निश्चित रूप से ध्यान देने योग्य है। – rubyprince