Rails中如何用正则匹配params中以_member1结尾的键?
用正则筛选Rails params中以_member1结尾的键
当然可以实现这个需求!不过Rails的params对象并不支持params["*_member1"]这种通配符写法,我们可以结合Ruby的正则表达式和Hash的方法来筛选符合条件的键值对,下面是几种实用的方案:
方案1:用select方法筛选键值对
这是最直观的方式,遍历params的所有键值对,保留符合正则匹配的项:
# 获取所有以_member1结尾的键值对(返回ActionController::Parameters或Hash对象) member1_params = params.select { |key, _| key.match?(/.*_member1$/) }
这里的正则/.*_member1$/中:
.*匹配任意长度的任意字符(保证键的开头可以是任意内容)$锚定到字符串结尾,确保键是严格以_member1结尾的
如果只需要提取符合条件的键数组,可以这样写:
member1_keys = params.keys.select { |key| key.match?(/.*_member1$/) }
要是只需要对应的值数组,结合values_at方法更高效:
member1_values = params.values_at(*member1_keys)
方案2:用grep方法简化筛选
Ruby的Hash对象支持grep方法,可以直接对键进行正则匹配:
# 返回键值对组成的数组,比如 [["guest1_member1", "value1"], ["guest2_member1", "value2"]] member1_pairs = params.grep(/.*_member1$/) # 如果需要转换成Hash对象 member1_params = Hash[member1_pairs]
注意事项
- 如果你使用的是Rails 5及以上版本,
params是ActionController::Parameters对象,它继承了Hash的核心方法,所以上述代码都可以直接使用 - 正则中的
.*会匹配空字符,如果你需要键的开头必须有内容(比如不能是_member1这种键),可以把正则改成/.+_member1$/(+表示至少匹配一个字符)
内容的提问来源于stack exchange,提问作者Muhammad Faisal Iqbal
相关产品推荐
相关产品推荐

