রেলগুলিতে পরামিতি বিদ্যমান থাকলে কীভাবে পরীক্ষা করবেন


179

আমি অনুরোধের পরামিতিগুলি সেট করা আছে কিনা তা পরীক্ষা করে পরীক্ষা করার জন্য আমি রেল অন রুবেলে একটি আইএফ স্টেটমেন্ট ব্যবহার করছি। উভয় পরামিতি সেট করা আছে কিনা তা নির্বিশেষে, ব্লকটি যদি ট্রিগার হয়ে যায় তবে নীচের প্রথম অংশটি। যদি উভয় প্যারাম [: এক] এবং প্যারাম সেট করা থাকে তবে আমি কীভাবে এই অংশটিকে কেবল ট্রিগার করতে পারি?

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

10
@ নাকিলন: প্রদত্ত যেটি paramsএকটি রেলস নিয়ন্ত্রক পদ্ধতি (এটি হ্যাশওয়াইথইন্ডিফিলারএ্যাক্সেস ফিরিয়ে দেবে), এটি প্রায় কারাগার।
মিউ খুব ছোট

উত্তর:


344

আপনি চান has_key?:

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

কেবলমাত্র চেকিং if(params[:one])একটি "সেখানে তবে নীল" এবং "সেখানে তবে মিথ্যা" মান দ্বারা বোকা হয়ে যাবে এবং আপনি অস্তিত্ব সম্পর্কে জিজ্ঞাসা করছেন। আপনার আলাদা করার দরকার হতে পারে:

  • মোটেই নেই।
  • সেখানে কিন্তু nil
  • সেখানে কিন্তু false
  • সেখানে একটি খালি স্ট্রিং।

যেমন. আপনার সঠিক পরিস্থিতির আরও বিশদ ছাড়াই বলা শক্ত।


3
@ সাওয়া কোনও nilপরামিতি পাস করা সম্ভব নয় । যদি প্যারামিটারটি বিদ্যমান থাকে তবে এটি খালি স্ট্রিং হবে।
জ্যাকব রিলকিন

5
@ জ্যাকব: এমন কোনও গ্যারান্টি নেই যা paramsআগে প্রসেস করা হয়নি যেখানে আমরা সেখানে যাচ্ছি সেখানে যাচাই করে দেখছি। অতএব আমার সম্ভাব্য বিশেষ মামলার তালিকা পরীক্ষা করে দেখুন। আপনি আইএমএইচও বলতে যা বোঝায় ঠিক তা বলা ভাল।
মিউ খুব ছোট

1
@ মাইস্টুশোর্ট আমার খারাপ, এটি ছিল পাইথন :(
ভাসমান

2
5 রেলগুলিতে, প্যারাম অবজেক্টটি আর হ্যাশ নয় এবং আমি key?পদ্ধতিটি দেখতে পাচ্ছি না । এজাপি.রুবিওনরইলস.আর
ক্লাসস /

1
পছন্দ করুন ডকুমেন্টেড এপিআইয়ের অংশ নয় এমন পদ্ধতিগুলি ব্যবহার করতে আমি এখনও কিছুটা দ্বিধা বোধ করছি তবে আমি নিশ্চিত যে এটি যথেষ্ট নিরাপদ। আমি এখনই ডাকছি params.to_h.key?
স্টিফেন.হ্যানসন

85

আমি ভক্ত

params[:one].present?

কেবল কারণ এটি params[sym]ফর্মটি রাখে তাই এটি পড়া সহজ।


1
আরও ভাল, 3 টি চর সংক্ষিপ্ত, সহজ।
বেনগালা

এই এক সেরা বৈধ প্রতিক্রিয়া হওয়া উচিত!
জ্যাকট্রেড

4
সাবধানতা অবলম্বন ব্যবহার করে? বুলিয়ান সহ (সত্যের জন্য অপরিবর্তিত পদ্ধতি `উপস্থিত ': ট্রু ক্লাস) Has_key এর সাথে গৃহীত উত্তর? সব ধরণের জন্য কাজ করে।
StCleezy

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
এটি প্যারামিটারটি আছে কিনা তা যাচাই করে না তবে বাস্তবে শূন্য করতে সেট করে।
ডেমিন

@ দােমিন বাস্তবে যদিও একটি প্যারামিটার একটি অনুরোধ শিরোনাম বাতিল করতে পারবেন না। এটি হয় শূন্য বা একটি স্ট্রিং।
জ্যাকব রিলকিন

হ্যাঁ তবে অন্যান্য লোকেরা যেমন বলেছে, এটি অন্য কোনও কিছু, একটি প্লাগইন, রত্ন বা আপনার নিজস্ব কোড দ্বারা পরিবর্তিত হতে পারে বা কিছু উদ্ভট কারণে পার্স করতে ব্যর্থ হয়।
ডেইমিন

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

আমি কেবল এটি রুবিআইনরেইল ক্লাসে পড়ি 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?
করছিলাম

কীটি হ'ল সঠিক পদ্ধতি, আপনার পদ্ধতি ধরে নিয়েছে যে এই পরমটি ইতিমধ্যে বিদ্যমান তাই আপনি শূন্যতার সাথে শূন্য করতে যা যা কার্যকর হতে পারে তবে সেরা পদ্ধতি নয়।
পল ব্রুনাচে

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] 

। অন্তর্ভুক্ত? (শূন্য) তারপর কোনও শূন্য মানের জন্য অ্যারে পরীক্ষা করে। এটি সত্য ফিরে আসবে অ্যারে শূন্য অন্তর্ভুক্ত।

কিছু ক্ষেত্রে আপনি এটিও পরীক্ষা করতে পারেন যে প্যারামগুলিতে মিথ্যা মান রয়েছে না এবং খালি স্ট্রিং রয়েছে।

বিবৃতি না দেওয়া পর্যন্ত আপনি নীচের কোডটি যুক্ত করে সেই মানগুলি পরিচালনা করতে পারেন।

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

এটি লক্ষ্য করা গুরুত্বপূর্ণ যে মুছুন_আইফ আপনার হ্যাশ / প্যারামগুলিকে সংশোধন করবে, তাই সতর্কতার সাথে ব্যবহার করুন।

উপরের সমাধানটি সুস্পষ্টভাবে সেট আপ করতে কিছুটা বেশি কাজ নেয় তবে আপনি যদি আরও বেশি পরীক্ষা করে নিচ্ছেন তবে কেবল এক বা দুটি প্যারাম।


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

একই সমস্যার জন্য কেবল এটি একসাথে ছাঁটাই:

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

[: Two] .empty ব্যবহার করে প্যারামিটারগুলি খালি কিনা তাও আপনি দেখতে পারেন


1
এটি উভয় পরামিতি সংজ্ঞায়িত করা হয় যেখানে কেস যদিও। এটি কেসটি কভার করে না যেখানে তাদের একজন মিথ্যা হিসাবে মূল্যায়ন করে।
EmFi

0

আমি দেরিতে চেষ্টা করি, তবে দূর থেকে উত্তর:

যদি আপনি জানতে চান যে কোনও (কোনও) হ্যাশের মানগুলি সেট করা আছে কিনা, উপরের সমস্তগুলি তাদের দৃষ্টিকোণের উপর নির্ভর করে সত্য উত্তর দেয়।

আপনি যদি আপনার (জিইটি / পোষ্ট ..) প্যারামগুলি পরীক্ষা করতে চান তবে আপনি যা মূল্য হিসাবে প্রত্যাশা করছেন তার থেকে আরও বিশেষ কিছু ব্যবহার করা উচিত params[:one], এর মতো কিছু

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

প্যারামিটার (জিইটি / পোষ্ট) উপেক্ষা করে যদি তারা সেট না করে থাকে, যদি তারা প্রত্যাশার মতো ফিট না করে

if params[:one] হ্যাকিংয়ের জন্য আপনার পৃষ্ঠাটি খোলার জন্য নিল / সত্য সনাক্তকরণের সাথে একটি মাত্র একটি পদক্ষেপ, কারণ, সাধারণত এটি select ... where params[:one] ...উদ্দেশ্যযুক্ত বা না থাকলে, সক্রিয় বা কোনও কাঠামোর মধ্যে বা পরে যেমন কিছু ব্যবহৃত হয় তা পরবর্তী পদক্ষেপ ।

একটি উত্তর বা কেবল একটি ইঙ্গিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.