Ruby on Rails에서 쿼리 문자열 인 것처럼 문자열 구문 분석


78

다음과 같은 문자열이 있습니다.

"foo=bar&bar=foo&hello=hi"

Ruby on Rails는 이것을 쿼리 문자열 인 것처럼 구문 분석하는 메서드를 제공하므로 다음과 같은 해시를 얻습니다.

{
    :foo => "bar",
    :bar => "foo",
    :hello => "hi"
}

아니면 직접 써야하나요?

편집하다

위의 문자열은 URL의 실제 쿼리 문자열이 아니라 Facebook Connect의 쿠키에 저장된 문자열입니다.

답변:


163

대답은 사용중인 Rails 버전에 따라 다릅니다. 2.3 이상을 사용하는 경우 Params에 랙의 내장 파서를 사용하십시오.

 Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}

이전 Rails를 사용하는 경우 실제로 CGI::parse. 해시 및 배열 처리는 모듈간에 미묘한 방식으로 다르므로 가져 오는 데이터가 선택한 방법에 맞는지 확인해야합니다.

Rack::Utils속기 액세스를 위해 클래스에 포함 할 수도 있습니다.


rails가 제공하는 것과 같은 params 객체를 얻으려면 다음과 같이 할 수 있습니다. params = ActionController :: Parameters.new (Rack :: Utils.parse_nested_query ( "a = 2"))
adailey

쿼리 문자열 매개 변수 값이 문자열로 캐스팅되는 것을 피할 수 있는지 여부를 아는 사람이 있습니까? 예를
들어이 동작을 원합니다.```Rack

1
이것은 대부분의 경우 좋지만으로 구문 분석 "a[]=&a[]=z"합니다 {"a[]"=>["", "z"]}. 실제로 ActionController::Base반환에 사용되는 구문 분석기는 무엇이든 상관 없습니다.{:a => ["z"]}
Jeremy List

37

그만큼

CGI::parse("foo=bar&bar=foo&hello=hi")

당신에게 준다

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}

2
이것은 각 매개 변수의 여러 인스턴스를 처리하는 유일한 구현입니다. 감사합니다!
Ryan Long

7
문제는 대부분의 사람들이 배열을 원하지 않고 간단한 key => value 응답을 기대한다는 것입니다
bgcode

12

편집하다 : 코멘트에서 말했듯이, 누군가가 당신을 해치고 싶다면 symolizing 키는 서버를 다운시킬 수 있습니다. 저 프로필 앱에서 작업 할 때는 작업이 더 쉬워지기 때문에 여전히 많이합니다.하지만 높은 지분 앱에서는 더 이상하지 않을 것입니다.

원하는 결과를 얻기 위해 키를 상징하는 것을 잊지 마십시오

Rack::Utils.parse_nested_query("a=2&b=tralalala").deep_symbolize_keys

이 작업은 중복에 대해 파괴적입니다.


8
사용자가 제공 한 키를 상징하는 것은 나쁜 생각입니다. 심볼은 GC가 아니므로 누군가 가짜 매개 변수 키를 많이 사용하여 서버에 스팸을 보내면 어느 시점에서 프로세스 메모리가 소모됩니다.
Julik

6
Ruby 2.2는 이제 GC 기호가됩니다.
Lesleh

8

매개 변수에 대한 데이터를 가져 오는 데 사용되는 URL에 대해 이야기하는 경우

> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"

그런 다음 쿼리 매개 변수를 가져옵니다. 사용하다

> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}

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