यदि पैरामीटर रेल में मौजूद हैं तो परीक्षण कैसे करें


179

यदि अनुरोध पैरामीटर सेट हैं, तो मैं कोशिश और परीक्षण करने के लिए पटरियों पर रूबी में एक IF स्टेटमेंट का उपयोग कर रहा हूं। भले ही दोनों पैरामीटर सेट हों या न हों, अगर ब्लॉक हो जाता है तो निम्नलिखित का पहला भाग। अगर दोनों परम [: एक] और परमेस [: दो] सेट कर दिया जाए तो मैं इस हिस्से को कैसे चालू कर सकता हूं?

if (defined? params[:one]) && (defined? params[:two])
 ... do something ...
elsif (defined? params[:one])
 ... do something ...
end

10
@Nakilon: यह देखते हुए कि paramsएक रेल नियंत्रक विधि है (जो एक HashWithIndifferentAccess को वापस करने के लिए होती है), यह रेल के बारे में है।
म्यू

जवाबों:


345

आप चाहते हैं has_key?:

if(params.has_key?(:one) && params.has_key?(:two))

बस जाँच if(params[:one])"वहाँ लेकिन शून्य" और "वहाँ लेकिन झूठी" मूल्य से मूर्ख हो जाएगा और आप अस्तित्व के बारे में पूछ रहे हैं। आपको अंतर करने की आवश्यकता हो सकती है:

  • बिलकुल नहीं।
  • वहाँ लेकिन nil
  • वहाँ लेकिन false
  • वहाँ लेकिन एक खाली स्ट्रिंग।

भी। अपनी सटीक स्थिति के अधिक विवरण के बिना कहना मुश्किल है।


3
@sawa एक nilपैरामीटर पास करना संभव नहीं है । यदि पैरामीटर मौजूद है, तो यह एक खाली स्ट्रिंग होगा।
याकूब रीलकिन

5
@ जैकोब: कोई गारंटी paramsनहीं है कि हम पहले से संसाधित नहीं हुए हैं, जहां हम जांच कर रहे हैं कि इसमें क्या है। इसलिए जाँच करने के लिए संभावित विशेष मामलों की मेरी सूची। सबसे अच्छा कहने का मतलब है कि आप IMHO का क्या मतलब है।
mu

1
@ म्युइस्टोओशर्ट मेरा बुरा, वह पायथन था :(
फ्लोटिंगरॉक

2
रेल 5 में, परम ऑब्जेक्ट अब एक हैश नहीं है, और मैं key?विधि नहीं देखता हूं । edgeapi.rubyonrails.org/classes/ActionController/…
stephen.hanson

1
@ म्युइस्टोशॉर्ट ओह, अच्छा है। मैं अभी भी उन तरीकों का उपयोग करने में थोड़ा संकोच कर रहा हूं जो दस्तावेज एपीआई का हिस्सा नहीं हैं, लेकिन मुझे यकीन है कि यह पर्याप्त सुरक्षित है। params.to_h.key?अभी के लिए बुला रहा हूँ ।
Stephen.hanson

86

मैं का प्रशंसक हूं

params[:one].present?

सिर्फ इसलिए कि यह params[sym]फॉर्म रखता है इसलिए इसे पढ़ना आसान है।


1
बेहतर, 3 वर्ण छोटा, सरल।
बेंगला

यह सबसे अच्छा वैध प्रतिक्रिया होनी चाहिए!
१२:१६

4
वर्तमान का उपयोग कर सावधान? बूलियन के साथ (अपरिभाषित विधि सत्य के लिए 'वर्तमान': TrueClass)। Has_key के साथ स्वीकृत उत्तर? सभी प्रकार के लिए काम करता है।
स्टैक्लेज़ी

2
स्पष्ट होने के लिए यह कुछ मामलों में काम नहीं करता है जैसे कि असत्य। => झूठा तो काम नहीं करेगा जैसे कि जोंस शरीर के माध्यम से मापदंडों को पारित करना जैसे कि बूलियन को पारित कर सकते हैं।
जेम्स

यदि आप इस तर्क का उपयोग किसी दृश्य में कर रहे हैं, तो वर्तमान विफल हो जाएगा क्योंकि पैरामीटर सरणी पहले से ही आबंटित हो रही है और यदि विफल हो रही है। has_keyइसके बजाय आपको वह देता है जिसकी आपको तलाश है।
जेरोम

22

रिक्त उपयोग करें? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F

unless params[:one].blank? && params[:two].blank?

अगर इसकी खाली या शून्य है तो सच वापस आ जाएगी

यह भी ... अगर आप बूलियन मूल्यों का परीक्षण कर रहे हैं तो काम नहीं करेगा .. कब से

>> false.blank?
=> true

उस स्थिति में आप उपयोग कर सकते हैं

unless params[:one].to_s.blank? && params[:two].to_s.blank?

3
या present?जो इसके विपरीत लौटाता है blank?। इसलिए यदि आप चाहते हैं तो आप unlessइसे बदल सकते हैं if
इंकलाब

@ काम कर रहा है, लेकिन एक इनलाइन unlessयह ठीक है। लेकिन हाँ, मैं बेहतर की तरह ifसाथpresent?
ऑरलैंडो

17

आप इसे निम्नलिखित तरह से अधिक सफलतापूर्वक लिख सकते हैं:

required = [:one, :two, :three]
if required.all? {|k| params.has_key? k}
  # here you know params has all the keys defined in required array
else
  ...
end

1
मुझे यह पसंद है कि यह कितना साफ है। मैं हालांकि रूबी के लिए नया हूं। किसी भी नुकसान या छूटे हुए किनारे के मामलों के बारे में मुझे पता होना चाहिए?
शॉन

10

पाई के रूप में सरल:

if !params[:one].nil? and !params[:two].nil?
  #do something...
elsif !params[:one].nil?
  #do something else...
elsif !params[:two].nil?
  #do something extraordinary...
end

3
यह जाँच नहीं करता है कि क्या पैरामीटर है लेकिन वास्तव में शून्य पर सेट है।
डेमिन

@Daemin वास्तविकता में, एक पैरामीटर को अनुरोध शीर्षलेख में शून्य करने के लिए सेट नहीं किया जा सकता है। यह या तो शून्य या एक स्ट्रिंग है।
याकूब रीलकिन

हां, लेकिन जैसा कि अन्य लोगों ने कहा है, यह किसी अन्य चीज, एक प्लगइन, मणि, या आपके अपने कोड द्वारा संशोधित हो सकता है, या बस कुछ विचित्र कारण से पार्स करने में विफल रहता है।
डेमिन

4
एक पाई बनाना वास्तव में जटिल है
सीजर

जब तक आप उपयोग नहीं करते हैं तब तक
एलिरेज़ा रहमानी खलीली

5
if params[:one] && params[:two]
 ... do something ...
elsif params[:one]
 ... do something ...
end

5

अपने परमों को डिफ़ॉल्ट मान प्रदान करने का एक बहुत ही सरल तरीका: params[:foo] ||= 'default value'


2
आप params.fetch(:foo, 'default value')भी कर सकते हैं
मारियो पेरेस

5

मैंने अभी इसे RubyInRails classes http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F पर पढ़ा

आप blank?विधि का उपयोग कर सकते हैं जो इसके बराबर हैparams[:one].nil? || params[:one].empty?

(उदाहरण के लिए)

if params[:one].blank? 
  # do something if not exist
else
  # do something if exist
end

बिल्कुल सही, मैं इस्तेमाल कर रहा थाparams[:one].nil? || params[:one].empty?
GOXR3PLUS

कुंजी की सही विधि है, आपकी विधि ने मान लिया कि यह परम मौजूद है इसलिए आप शून्य पर शून्य को मान्य कर रहे हैं जो काम कर सकता है लेकिन सर्वोत्तम विधि नहीं।
पॉल ब्रूनाचे

3

आप निम्न कार्य भी कर सकते हैं:

unless params.values_at(:one, :two, :three, :four).includes?(nil)
 ... excute code ..
end 

मैं उपरोक्त समाधान का उपयोग करता हूं जब मैं अधिक से अधिक एक या दो पैरेम्स की जांच करना चाहता हूं।

.values_at रिटर्न और किसी भी अपरिभाषित परम की जगह में शून्य के साथ सरणी। अर्थात:

some_hash = {x:3, y:5}
some_hash.values_at(:x, :random, :y}

निम्नलिखित वापस करेंगे:

[3,nil,5] 

.includes? (nil) तब किसी भी शून्य मान के लिए सरणी की जाँच करता है। यह सच है कि सरणी में शून्य शामिल है।

कुछ मामलों में आप यह भी जांचना चाह सकते हैं कि परमेस में नहीं है और गलत मूल्य पर खाली स्ट्रिंग है।

आप उन मानों को संभाल सकते हैं जब तक कि कथन के ऊपर निम्न कोड नहीं जोड़ा जाता।

params.delete_if{|key,value| value.blank?}

सभी एक साथ इस तरह दिखेंगे:

 params.delete_if{|key,value| value.blank?}
 unless params.values_at(:one, :two, :three, :four).includes?(nil)
   ... excute code ..
  end

यह ध्यान रखना महत्वपूर्ण है कि delete_if आपके हैश / परम को संशोधित करेगा, इसलिए सावधानी के साथ उपयोग करें।

उपरोक्त समाधान स्पष्ट रूप से सेट करने के लिए थोड़ा अधिक काम करता है, लेकिन इसके लायक है यदि आप अधिक जाँच कर रहे हैं तो बस एक या दो पैरेम्स।


3

पिछले जवाब के अलावा: has_key?और has_value?है कम विकल्प के रूप में key?और value?। रूबी टीम भी छोटे विकल्पों का उपयोग करने का सुझाव देती है , लेकिन पठनीयता के लिए कुछ अभी भी इन तरीकों के लंबे संस्करणों को पसंद कर सकते हैं।

इसलिए आपके मामले में यह कुछ ऐसा होगा

if params.key?(:one) && params.key?(:two)
  ... do something ...
elsif params.key?(:one)
  ... do something ...
end

नायब! .key?बस जाँच करेगा कि क्या कुंजी मौजूद है और जो भी संभव मूल्य को अनदेखा करता है। पूर्व के लिए:

2.3.3 :016 > a = {first: 1, second: nil, third: ''}
  => {:first=>1, :second=>nil, :third=>""}
2.3.3 :017 > puts "#{a.key?(:first)}, #{a.key?(:second)}, #{a.key?(:third), #{a.key?(:fourth)}}"
true, true, true, false

2

यहाँ मैं क्या कर रहा हूँ,

before_action :validate_presence

और फिर निम्नलिखित तरीके:

    def check_presence
  params[:param1].present? && params[:param2].present?
 end

 def validate_presence
  if !check_presence
    render json:  {
                      error:  {
                                message: "Bad Request, parameters missing.",
                                status: 500
                              }
                    }
  end
 end

1

बस एक ही समस्या के लिए यह एक साथ pieced:

before_filter :validate_params

private

def validate_params
  return head :bad_request unless params_present?
end

def params_present?  
  Set.new(%w(one two three)) <= (Set.new(params.keys)) &&
  params.values.all?
end

पहली पंक्ति यह जांचती है कि क्या हमारे लक्ष्य कुंजी <= सबसेट का उपयोग करते हुए परम की कुंजी में मौजूद हैं? ऑपरेटर। Enumerable.all? यदि कोई मान शून्य है या गलत है, तो प्रति डिफ़ॉल्ट बिना ब्लॉक झूठा लौटता है।


0
if params[:one] && param[:two]
  ... excute code ..
end

आप यह भी जांच सकते हैं कि पैरामीटर पैरामस [: दो] .empty का उपयोग करके खाली हैं या नहीं


1
जबकि यह उस मामले को कवर करता है जहां दोनों मापदंडों को परिभाषित किया गया है। यह उस मामले को कवर नहीं करता है जहां उनमें से एक गलत का मूल्यांकन करता है।
1

0

मैं देर से प्रयास करता हूं, लेकिन दूर से देखने वाले उत्तर:

यदि आप यह जानना चाहते हैं कि क्या (किसी) हैश में मान सेट किए गए हैं, तो उपरोक्त सभी उनके जवाब के आधार पर एक सही उत्तर देते हैं।

यदि आप अपने (GET / POST ..) परिक्षण का परीक्षण करना चाहते हैं, तो आपको कुछ विशेष का उपयोग करना चाहिए, जिसकी आपको अपेक्षा है params[:one], जैसे कुछ

if params[:one]~=/   / and  params[:two]~=/[a-z]xy/

पैरामीटर की अनदेखी (GET / POST) के रूप में अगर वे सेट नहीं है, अगर वे उम्मीद की तरह फिट नहीं है

if params[:one] हैकिंग के लिए अपने पेज को खोलने के लिए सिर्फ एक या बिना नील / सही पता लगाने के लिए एक कदम है, क्योंकि, यह आम तौर पर किसी चीज का उपयोग करने के लिए अगला कदम है select ... where params[:one] ..., अगर यह इरादा है या नहीं, सक्रिय या एक रूपरेखा के भीतर या बाद में।

एक जवाब या सिर्फ एक संकेत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.