如何在 redirect_to 中有选择地添加查询参数?

How can I selectively add query parameters in redirect_to?

在我的应用程序中,session 散列可以包含键 sortratings(除了 _csrf_tokensession_id),具体取决于用户采取什么行动。也就是说,它可以同时包含它们,或者其中之一,或者两者都不包含,具体取决于用户的操作。

现在,我希望在我的应用程序中调用 redirect_to,同时恢复用户可能提供的任何会话信息(sortratings)。

为此,我想在调用 redirect_to。因此,路径可能类似于 /movies?sort=...&ratings=....

我不知道怎么写这个逻辑。我怎样才能做到这一点?我如何在调用 redirect_to 时有选择地插入查询参数?甚至可以这样做吗?

非常感谢任何帮助。提前谢谢你。

首先只需编写一个包含您想要的参数的散列 - 例如:

opts = session.slice(:sort, :ratings)
              .merge(params.slice(:sort, :ratings))
              .compact_blank 

此示例将包含键 :sort, :ratings 以及合并在顶部的参数中的相同键(优先)。

然后您可以将哈希传递给所需的路径助手:

redirect_to foos_path(**opts)

您可以只传递尾随哈希选项或使用 params 选项明确设置查询字符串:

irb(main):007:0> app.root_path(**{ sort: 'backwards' })
=> "/?sort=backwards"
irb(main):008:0> app.root_path(params: { ratings: 'XX' })
=> "/?ratings=XX"
irb(main):009:0> app.root_path(params: { })
=> "/"   

空散列将被忽略。

如果您使用散列而不是字符串调用 redirect_to,您可以使用 params: 键添加查询字符串参数:

redirect_to { action: :foo, params: opts }

如果您正在使用任意给定 URL/path 并且想要操作查询字符串参数,您可以将 URI 模块与 Rack 和 ActiveSupport 提供的实用程序一起使用,以将查询字符串转换为散列,反之亦然相反:

uri = URI.parse('/foo?bar=1&baz=2&boo=3')
parsed_query = Rack::Utils.parse_nested_query(uri.query)
uri.query = parsed_query.except("baz").merge(x: 5).to_query 
puts uri.to_s # => "/foo?bar=1&boo=3&x=5"