2012-04-17 1 views
0

내시나 응용 프로그램에서이 필터를 가지고 :Ruby 버전에 따라 배열 또는 문자열로 Splat 하시겠습니까?

before '/:locale/*' do 
    # stuff... 
    request.path_info = params[:splat] 
end 

즉, 난 그냥 URL의 로케일 부분을 가져 와서이없는 것처럼 다음 응용 프로그램 것이며 진행을 수 있도록합니다. (물론 뷰를 렌더링 할 때 로케일을 사용합니다.)

이 작업은 Ruby 1.8.7에서 제대로 작동하지만 splat가 이제는 문자열 대신 하나의 항목을 가진 배열이기 때문에> = 1.9에서 중단됩니다. 작동하게하려면 params[:splat].first을 사용해야했습니다.

제 질문은 단순히이 불일치가 발생하는 곳입니다. 그것은 단순히 Ruby 1.8 대 1.9 것입니까? 아니면 Sinatra가 어떻게 든 관련되어 있습니까?

미래에 이런 종류의 문제를보다 쉽게 ​​해결할 수 있기를 바랍니다.

request.path_info = [*params[:splat]].first 

내가 여기에 설명 : 당신이 두 경우를 처리하기 위해이 같은 일을 할 수 있도록, 문자열이나 배열이 될 수 있습니다 : [플랫]

답변

2

시나의 문서는 그 PARAMS 나타낼 것으로 보인다

$ cat splat.rb 
[ { :splat => [ "/foo" ] }, { :splat => "/foo" } ].each do |params| 
    path_info = [*params[:splat]].first 
    puts "#{path_info} (#{path_info.class})" 
end 
$ ruby1.8 splat.rb 
/foo (String) 
/foo (String) 
$ ruby1.9.1 splat.rb 
/foo (String) 
/foo (String) 
+0

니스, 감사합니다. 이 차이가 왜 처음에 나타나는 지에 대한 통찰력이 있습니까? 그리고 예, Sinatra README에는 배열과 문자열 인 splat의 예가 있습니다. – Felixyz