如何在Ruby on Rails中通过自定义路由构建嵌套Params哈希?
当然可以!在Rails里实现这种参数哈希嵌套其实有几种实用的方式,我给你拆解一下:
方法1:控制器层面快速处理(最简单)
如果只是这个特定的动作需要嵌套参数,直接在foo_controller的bar方法里手动调整参数结构就好,简单直接:
def bar # 先初始化嵌套的哈希,避免nil报错 params[:namespace] ||= {} # 把顶层的q参数移到namespace下,同时删除原来的顶层参数(可选) params[:namespace][:q] = params.delete(:q) # 现在你就可以用 params[:namespace][:q] 访问啦 end
方法2:路由层面统一配置(适合全局或多路由复用)
如果你想在路由层面就把参数直接嵌套好,不用在控制器里写额外代码,可以利用路由的defaults选项结合lambda来动态构造嵌套参数:
get ':q', to: 'foo#bar', defaults: { namespace: ->(request) { { q: request.params[:q] } } }
这样请求进来后,params[:namespace][:q]会自动填充原来的:q参数值,同时原来的params[:q]也会保留(如果不需要可以在控制器里删掉)。
额外提示:路由URL生成的兼容
如果之后需要用路由辅助方法生成URL,比如foo_bar_path,你可以直接传嵌套参数,Rails会自动提取:q的值拼到URL里:
# 生成的URL是 /hello_world foo_bar_path(namespace: { q: 'hello_world' })
内容的提问来源于stack exchange,提问作者Dennis Nedry
相关产品推荐
相关产品推荐

