Rails: противоположность хэшу#to_param

#ruby-on-rails #ruby #ruby-on-rails-3

#ruby-on-rails #ruby #ruby-on-rails-3

Вопрос:

Если я преобразовываю хэш в строку запроса, как я могу преобразовать его обратно?

 {:filters => {:colour => ['Red', 'Blue'], :size => 'Medium'}}.to_param
=> "filters[colour][]=Redamp;filters[colour][]=Blueamp;filters[size]=Medium"
  

Кажется, что Rails делает это автоматически, когда заполняет params хэш, но возможно ли вызвать этот метод напрямую?

Спасибо.

Ответ №1:

Вы ищете Rack::Utils.parse_nested_query(query) , который преобразует его обратно в Hash . Вы можете получить его, используя эту строку:

 require 'rack/utils'
  

Комментарии:

1. Rack::Utils.build_nested_query('filters[colour][]=Redamp;filters[colour][]=Blueamp;filters[size]=Medium') приводит к ArgumentError: value must be a Hash . Что я делаю не так?

2. Ах, я вижу, вы отредактировали свой ответ. parse_nested_query работает отлично, спасибо!

3. @gjb: да, извините, я постоянно путаю эти два параметра.

4. Значения Nil не сохраняются, вместо этого они будут пустыми строками: Rack::Utils.parse_nested_query({foo: nil}.to_param) => {"foo"=>""}

Ответ №2:

 query_string = "filters[colour][]=Redamp;filters[colour][]=Blueamp;filters[size]=Medium"
CGI::parse(query_string)
  

Комментарии:

1. Хорошо, но не совсем так. Это не генерирует хэш с ключом filters, который имеет хэш с ключом color, который имеет массив в качестве значения … что Rack::Utils.parse_nested_query и делает.