codememo

레일에 매개변수가 있는지 테스트하는 방법

tipmemo 2023. 6. 2. 20:32
반응형

레일에 매개변수가 있는지 테스트하는 방법

Ruby on Rails의 IF 문을 사용하여 요청 매개 변수가 설정되었는지 테스트하고 있습니다.두 파라미터의 설정 여부에 관계없이 블록이 트리거될 경우 다음의 첫 번째 부분이 표시됩니다.파라미터 [:1]과 파라미터 [:2]가 모두 설정된 경우에만 이 부품을 트리거하려면 어떻게 해야 합니까?

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

원하는 항목:

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

확인 중입니다.if(params[:one])"거기 있지만 0" 및 "거기 있지만 거짓" 값에 속을 것이고 당신은 존재에 대해 묻는 것입니다.차별화가 필요할 수도 있습니다.

  • 전혀 없습니다.
  • 거기서 그러나nil.
  • 거기서 그러나false.
  • 빈 문자열만 있습니다.

뿐만 아니라.당신의 정확한 상황에 대한 더 자세한 설명 없이는 말하기 어렵습니다.

저는 의 팬입니다.

params[:one].present?

단지 그것이 그것을 유지하기 때문에.params[sym]읽기 쉽도록 형태를 만듭니다.

공백 사용?http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F

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

비어 있거나 0인 경우 true가 반환됩니다.

또한... 부울 값을 테스트하는 경우에는 작동하지 않습니다.부터

>> false.blank?
=> true

그런 경우에 당신은 사용할 수 있습니다.

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

다음과 같이 보다 간결하게 작성할 수 있습니다.

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

매우 간단합니다.

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

파라미터에 기본값을 제공하는 매우 간단한 방법:params[:foo] ||= 'default value'

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

다음 작업도 수행할 수 있습니다.

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

저는 한두 개 이상의 param을 확인하고 싶을 때 위의 솔루션을 사용하는 경향이 있습니다.

.values_at은 정의되지 않은 매개 변수 키의 위치에 0이 있는 배열을 반환합니다. 즉,

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

다음을 반환합니다.

[3,nil,5] 

그런 다음 배열에 0 값이 있는지 확인합니다.배열에 0이 포함된 경우 true가 반환됩니다.

경우에 따라 매개 변수에 잘못된 값의 문자열이 포함되어 있지 않은지 확인해야 할 수도 있습니다.

이러한 값은 unfe 문 위에 다음 코드를 추가하여 처리할 수 있습니다.

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는 해시/파라미터를 수정하므로 주의하여 사용하십시오.

위의 솔루션은 설정하는 데 약간의 작업이 더 필요하지만 한두 개의 매개 변수 이상을 확인하는 경우에는 가치가 있습니다.

저는 방금 루비 인 레일즈 수업 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

이전 답변 외에 다음과 같은 답변이 있습니다.has_key?그리고.has_value?의 형태로 더 짧은 대안을 가지고 있습니다.key?그리고.value?Ruby 팀은 또한 짧은 대안을 사용할 것을 제안하지만, 가독성을 위해 일부는 여전히 이러한 방법의 긴 버전을 선호할 수 있습니다.

그러므로 당신의 경우에는 다음과 같은 것이 될 것입니다.

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

NB!.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

모든 매개 변수를 전환할 필요 없이 누락된 특정 매개 변수를 기반으로 오류를 반환하려면 다음을 수행합니다.

required_params = [:one, :two, :three]
required_params.each do |param|
  if params.has_key?(param)
    render json: { errors: "Missing parameter #{param.to_s}." }, :status => :bad_request 
    return
  end
end

동일한 문제에 대해 이 문제를 정리했습니다.

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이거나 거짓이면 false를 반환합니다.

제가 하는 일은 이렇습니다.

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
if params[:one] && param[:two]
  ... excute code ..
end

파라미터[:2]를 사용하여 파라미터가 비어 있는지 확인할 수도 있습니다.

저는 늦게 시도하지만, 멀리서 보면 대답합니다.

해시의 값이 설정되어 있는지 여부를 확인하려면 위의 모든 항목이 해당 시점에 따라 참으로 답합니다.

하려면 (GET/POST...)의보다 더 .params[:one] 같은 것

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

매개 변수(GET/POST)가 예상대로 맞지 않으면 설정되지 않은 것처럼 무시합니다.

한 저그if params[:one]제로 탐지 여부와 상관없이 해킹을 위해 페이지를 여는 것은 한 단계입니다. 왜냐하면 일반적으로 다음과 같은 것을 사용하는 것이기 때문입니다.select ... where params[:one] ...이것이 의도된 것인지 아닌지, 활성화된 것인지, 프레임워크 내 또는 프레임워크 후에 있는 것인지 여부.

대답이나 암시

언급URL : https://stackoverflow.com/questions/5629402/how-to-test-if-parameters-exist-in-rails

반응형