如何让Ruby on Rails API控制器接收查询参数的数组值?
让Ruby on Rails支持重复查询参数解析为数组(兼容Express行为)
Rails默认会覆盖重复的查询参数值,但我们可以通过自定义中间件修改这一行为,无需变更原有API的URL格式。
实现步骤
1. 创建自定义中间件
在app/middlewares目录下新建parse_array_query_params.rb文件,写入以下代码:
class ParseArrayQueryParams def initialize(app) @app = app end def call(env) request = Rack::Request.new(env) # 列出需要解析为数组的查询参数键,可根据需求添加 target_params = %w[include] target_params.each do |key| next unless request.GET.key?(key) # 获取该键对应的所有值 all_values = request.GET.fetch_values(key) # 如果有多个值,将参数值替换为数组 request.GET[key] = all_values if all_values.size > 1 end @app.call(env) end end
2. 注册中间件
打开config/application.rb,在应用配置中添加中间件:
module YourAppName class Application < Rails::Application # ... 其他现有配置 config.middleware.use ParseArrayQueryParams end end
3. 验证效果
启动Rails服务后,访问http://localhost:3000/api/resource?include=foo&include=bar,在对应的控制器中调用params[:include],会得到数组["foo", "bar"],与Express的解析行为完全一致。
注意事项
- 该中间件仅针对你指定的参数(示例中的
include)生效,不会影响其他参数的默认解析逻辑,避免引入不必要的全局变更。 - 如果后续需要支持更多参数,只需在
target_params数组中添加对应的键即可。
内容的提问来源于stack exchange,提问作者kylejw2
相关产品推荐
相关产品推荐

