Rails 如何为当前 URL append 参数?

brookepowell · 2020年06月23日 · 最后由 brookepowell 回复于 2020年06月23日 · 2188 次阅读

如果当前 URL 没有参数,我可以使用

link_to "example", url_for(new_param: "1")

但如果当前 URL 已有参数,如 http://localhost:3000/posts?page=1,我如果还用上面的方法,page参数就会被忽略。我尝试了 ruby-china 的切换语言链接,当主题列表中含page参数时,也存在此问题。

我尝试使用下面的方法来 merge 参数

link_to "example", url_for(params.merge(new_param: "1"))

会提示错误:

unable to convert unpermitted parameters to hash

虽然下面的办法会有效,但会影响安全性:

params.permit!
link_to "example", url_for(params.merge(new_param: "1"))

URL 中已存在的参数是不固定的,请问有没有完美的方法实现这个目的?

我看 kaminari 分页里是 to_unsafe_h,然后 except! 掉一些参数名 https://github.com/kaminari/kaminari/blob/ab8b1118bd721edc520a7cd32e0a72dc6d0d3608/kaminari-core/lib/kaminari/helpers/tags.rb#L25

@params = template.params
# @params in Rails 5 no longer inherits from Hash
@params = @params.to_unsafe_h if @params.respond_to?(:to_unsafe_h)
@params = @params.with_indifferent_access
@params.except!(*PARAM_KEY_EXCEPT_LIST)
@params.merge! params

维护一个允许的参数白名单,但是新增参数的时候一不小心就会忘记掉,导致生成 URL 的时候参数丢失

zhuoerri 回复

这个方法解决了我的问题,感谢。

brookepowell 关闭了讨论。 06月23日 21:37
brookepowell 重新开启了讨论。 06月23日 21:38
需要 登录 后方可回复, 如果你还没有账号请 注册新账号