Я хочу передать параметры (хэш) на redirect_to
, как это сделать? Например:
hash = { :parm1 => "hi", :parm2 => "hi" }
и я хочу перенаправить на страницу /hello
URL-адрес: /hello?parm1=hi&parm2=hi
Я хочу передать параметры (хэш) на redirect_to
, как это сделать? Например:
hash = { :parm1 => "hi", :parm2 => "hi" }
и я хочу перенаправить на страницу /hello
URL-адрес: /hello?parm1=hi&parm2=hi
Если у вас нет именованного маршрута для /hello, вам придется жестко задавать параметры в строке, которую вы передаете в redirect_to
.
Но если у вас есть что-то вроде hello_path
, вы можете использовать redirect_to hello_path(:param1 => 1, :param2 => 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
Просто передайте хэш в аргумент в 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}"
Я знаю, что это может быть очень простой способ сделать это, но эй, он доставит вас где-нибудь:)
Самый простой способ (если это не именованный маршрут):
redirect_to "/hello?#{hash.to_param}"
Смотрите: http://apidock.com/rails/Hash/to_param
Я использовал следующую функцию до:
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 уже может содержать.