在我的应用程序中,session散列可以包含键sort和ratings (除了_csrf_token和session_id),这取决于用户采取的操作。也就是说,根据用户所做的事情,它可以同时包含两者,或者两者都不包含。
现在,我希望在我的应用程序中调用redirect_to,同时恢复用户可能提供的任何会话信息(sort或ratings)。
为此,我希望在调用session时将当前存储的键值sort和ratings作为查询参数插入。因此,路径看起来可能类似于/movies?sort=...&ratings=...。
我不知道该怎么写逻辑。我该怎么做?如何在调用redirect_to时有选择地插入查询参数?有可能这样做吗?
任何帮助都是非常感谢的。提前谢谢你。
发布于 2022-04-18 13:39:12
首先,只需编写一个包含所需参数的散列-例如:
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/路径,并且希望操作查询字符串参数,则可以使用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" https://stackoverflow.com/questions/71912046
复制相似问题