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


179

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

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

10
@Nakilon : params이것이 Rails 컨트롤러 메소드 (HashWithIndifferentAccess를 리턴하는 경우)라면 Rails에 관한 것입니다.
mu는

답변:


348

당신이 원하는 has_key?:

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

확인 만하면 if(params[:one])"없음은 있지만"및 "거짓은 있지만"값에 속아서 존재 여부를 묻습니다. 차별화해야 할 수도 있습니다.

  • 전혀 없습니다.
  • 하지만 nil.
  • 하지만 false.
  • 빈 문자열 만 있습니다.

게다가. 정확한 상황에 대한 자세한 내용 없이는 말하기가 어렵습니다.


3
@sawa nil매개 변수 를 전달할 수 없습니다 . 매개 변수가 존재하면 빈 문자열이됩니다.
Jacob Relkin

5
@Jacob : 내부의 params내용을 확인하기 전에 사전 처리되지 않았다는 보장 은 없습니다. 따라서 확인할 수있는 특수 사례 목록이 있습니다. IMHO의 의미를 정확히 말하십시오.
mu는 너무 짧습니다.

1
@muistooshort 내 나쁜, 그건 파이썬 이었다 :(
FloatingRock

2
Rails 5에서 params 객체는 더 이상 해시가 아니며 key?메서드 가 표시되지 않습니다 . edgeapi.rubyonrails.org/classes/ActionController/…
stephen.hanson

1
@muistooshort 아, 좋아. 나는 여전히 문서화 된 API의 일부가 아닌 메소드를 사용하는 것을 조금 주저하지만 충분히 안전하다고 확신합니다. 나는 params.to_h.key?지금 전화 했다.
stephen.hanson

86

나는 ~의 팬입니다

params[:one].present?

params[sym]양식을 유지하기 때문에 읽기가 더 쉽습니다.


1
3 문자가 짧고 간단합니다.
Bengala

이것은 가장 유효한 응답이어야합니다!
jacktrade

4
선물을 조심해서 사용 하시겠습니까? 부울 (true : TrueClass에 대해 정의되지 않은 메소드`present ')이있는 경우 has_key로 허용 된 답변? 모든 유형에 적용됩니다.
StCleezy

2
예를 들어 false.present?와 같은 경우에는 작동하지 않습니다. => false 따라서 부울을 전달할 수있는 것처럼 json body를 통해 매개 변수를 전달할 때 작동하지 않습니다.
제임스

1
뷰에서이 로직을 사용하는 경우 매개 변수 배열이 이미 호출되고 nil 인 경우 실패하므로 present가 실패합니다. has_key대신 당신이 찾고있는 것을 제공합니다.
Jerome

22

공백으로 사용 하시겠습니까? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F

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

비어 있거나 nil이면 true를 반환합니다.

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

>> false.blank?
=> true

이 경우 사용할 수 있습니다

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

3
또는 present?의 반대를 반환합니다 blank?. 당신은을 돌 수 있었다 그래서 unlessif당신이 원한다면.
Inkling

@Inkling 작동하지만 인라인 unless은 괜찮습니다. 그러나 그래, 나는 더 좋아 if한다present?
Orlando

18

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

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
나는 이것이 얼마나 깨끗한 지 좋아한다. 나는 루비를 처음 사용합니다. 내가 알아야 할 함정이나 누락 된 사례가 있습니까?
Sean

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
매개 변수가 있는지 확인하지 않지만 실제로는 nil로 설정합니다.
Daemin April

@Daemin 실제로는 요청 헤더에서 매개 변수를 nil로 설정할 수 없습니다. nil 또는 문자열입니다.
Jacob Relkin

예. 그러나 다른 사람들이 언급했듯이 다른 것, 플러그인, 보석 또는 자신의 코드에 의해 수정되거나 기괴한 이유로 구문 분석하지 못할 수 있습니다.
Daemin April

4
파이 만들기는 실제로 복잡합니다
Cesar

당신이 않는 한 왜 사용하지 않는가
Alireza Rahmani Khalili

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')있습니다
Mario Pérez

5

방금 RubyInRails 클래스에서 이것을 읽었습니다 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

Perfect, 나는 사용하고 있었다params[:one].nil? || params[:one].empty?
GOXR3PLUS

키가 올바른 방법입니다. 귀하의 방법은이 매개 변수가 이미 있다고 가정하여 nil에서 nil의 유효성을 검사하지만 작동 할 수는 있지만 최선의 방법은 아닙니다.
Paul Brunache

3

다음을 수행 할 수도 있습니다.

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

하나 이상의 매개 변수를 확인하려는 경우 위의 솔루션을 사용하는 경향이 있습니다.

.values_at는 정의되지 않은 매개 변수 키 대신 nil을 반환하고 배열합니다. 즉 :

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

다음을 반환합니다 :

[3,nil,5] 

.includes? (nil) 그런 다음 배열에 nil 값이 있는지 확인합니다. 배열에 nil이 포함되어 있으면 true를 리턴합니다.

경우에 따라 params에 포함되지 않은 문자열을 확인하고 false 값으로 문자열을 비울 수도 있습니다.

cannot 문 위에 다음 코드를 추가하여 해당 값을 처리 할 수 ​​있습니다.

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

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

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

첫 번째 줄은 <= 하위 집합을 사용하여 대상 키가 매개 변수 키에 있는지 확인합니다. 운영자. 열거 할 수 있습니까? 기본값이없는 블록은 값이 nil 또는 false 인 경우 false를 반환합니다.


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

params [: two] .empty를 사용하여 매개 변수가 비어 있는지 확인할 수도 있습니다.


1
여기에는 두 매개 변수가 모두 정의 된 경우가 포함됩니다. 그들 중 하나가 거짓으로 평가되는 경우는 다루지 않습니다.
EmFi

0

나는 늦게 시도하지만 멀리서 대답합니다.

(임의의) 해시 값이 설정되어 있는지 확인하려면 위의 관점에 따라 위의 모든 값이 true로 응답합니다.

(GET / POST ..) 매개 변수를 테스트하려면 params[:one]다음과 같은 값으로 예상되는 것보다 더 특별한 것을 사용해야합니다.

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

매개 변수 (GET / POST)를 설정하지 않은 것처럼, 무시할 수없는 경우 무시

다만 if params[:one] , 그것은 일반적으로 같은 사용 뭔가 다음 단계이기 때문에 또는 전무없이 참 / 탐지 해킹에 대한 귀하의 페이지를 엽니 다 한 단계이며, select ... where params[:one] ...이것은 활성 또는 내 또는 프레임 워크 후, 의도되거나되지 않은 경우.

답이나 힌트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.