如何在 redirect_to 中有选择地添加查询参数?
How can I selectively add query parameters in redirect_to?
在我的应用程序中,session
散列可以包含键 sort
和 ratings
(除了 _csrf_token
和 session_id
),具体取决于用户采取什么行动。也就是说,它可以同时包含它们,或者其中之一,或者两者都不包含,具体取决于用户的操作。
现在,我希望在我的应用程序中调用 redirect_to
,同时恢复用户可能提供的任何会话信息(sort
或 ratings
)。
为此,我想在调用 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"
在我的应用程序中,session
散列可以包含键 sort
和 ratings
(除了 _csrf_token
和 session_id
),具体取决于用户采取什么行动。也就是说,它可以同时包含它们,或者其中之一,或者两者都不包含,具体取决于用户的操作。
现在,我希望在我的应用程序中调用 redirect_to
,同时恢复用户可能提供的任何会话信息(sort
或 ratings
)。
为此,我想在调用 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"