Rails redirect_to с параметрами

Я хочу передать параметры (хэш) на redirect_to, как это сделать? Например:

hash = { :parm1 => "hi", :parm2 => "hi" }

и я хочу перенаправить на страницу /hello

URL-адрес: /hello?parm1=hi&parm2=hi

Ответ 1

Если у вас нет именованного маршрута для /hello, вам придется жестко задавать параметры в строке, которую вы передаете в redirect_to.

Но если у вас есть что-то вроде hello_path, вы можете использовать redirect_to hello_path(:param1 => 1, :param2 => 2)

Ответ 2

Вместо:

 redirect_to some_params

Вы можете сделать:

 redirect_to url_for(some_params)

Вы превращаете params в URL-адрес с url_for, прежде чем передавать его на redirect_to, поэтому то, что вы передаете redirect_to, становится URL-адресом в виде строки, которую redirect_to с удовольствием перенаправляет.

Хорошо заметьте. Я не понимаю, почему redirect_to отказывается использовать параметры. Раньше он был готов использовать параметры. В некоторых случаях кто-то добавил что-то в Rails, чтобы запретить это. Это заставляет меня подозревать, что для этого есть причины для безопасности, и если это так, то эти соображения безопасности могут означать, что при использовании redirect_to url_for(p) вручную также имеют последствия для безопасности. Но я еще не смог найти документацию, объясняющую, что здесь происходит.

update: я нашел предупреждение о безопасности, но еще не переварил его: https://github.com/rails/rails/pull/16170

Ответ 3

Просто передайте хэш в аргумент в URL-адресе, а в вашем коде проанализируйте его, чтобы получить все необходимые значения.

param_arr = []
hash.each do |key , val|
  param_arr << "#{key}=#{val}"
end
params_str = param_arr.join("&")

redirect_to "http://somesite.com/somepage?#{params_str}"

Я знаю, что это может быть очень простой способ сделать это, но эй, он доставит вас где-нибудь:)

Ответ 4

Самый простой способ (если это не именованный маршрут):

redirect_to "/hello?#{hash.to_param}"

Смотрите: http://apidock.com/rails/Hash/to_param

Ответ 5

Я использовал следующую функцию до:

def add_query_params(url, params)
  parsed_uri = URI(url)

  if parsed_uri.query
    query_params = URI.decode_www_form(parsed_uri.query)
  else
    query_params = []
  end

  params.each_pair do |k, v|
    query_params << [k.to_s, v]
  end

  parsed_uri.query = URI.encode_www_form(query_params)
  parsed_uri.to_s
end

Пример использования:

redirect_to add_query_params("/hello", parm1: 'hi', parm2: 'hi')

Это имеет преимущество в сохранении любых существующих параметров url, которые URL уже может содержать.