Ruby中调用super时如何在as_json内追加参数且不覆盖用户配置
解决方法
你原来的写法直接覆盖了methods的配置值,才会导致用户传入的参数丢失,只要先读取已有配置再做数组合并即可:
def as_json(options = {}) # 复制options避免修改原传入对象产生副作用 opts = options.dup # 统一转成数组后合并,兼容用户不传methods、或传单个Symbol的情况 opts[:methods] = Array(opts[:methods]) + [:name, :title] super(opts) end
说明
- 加
options = {}默认值是为了兼容无参调用as_json的场景,避免报nil相关错误 Array()方法可以把nil、单个Symbol、已有数组都统一转成数组格式,不需要额外做判空处理- 最终合并后的
methods会同时包含用户传入的配置和你自定义的name、title字段,其余only、except等其他配置都不会被修改
内容的提问来源于stack exchange,提问作者Ashbury
相关产品推荐
相关产品推荐

