将Rails 2升级至Rails 5时遇`with_scope`未定义错误及替代方案咨询
解决Rails 2升级到5.0.6的
with_scope替换问题 嘿,这个坑我之前帮人踩过!Rails 2里的with_scope在Rails 3之后就被官方弃用了,咱们直接把这段代码改成Rails 5支持的写法就行,逻辑完全能对齐。
原来的代码是用:create参数指定块内创建记录时的默认属性:
with_scope(:create => {:article_id => article_id, :created_at => created_at}) do yield end
直接替换成with_options写法就可以,这是Rails 3+专门用来替代这类场景的方法:
with_options(article_id: article_id, created_at: created_at) do yield end
为什么这么改?
with_options的作用就是给块内的所有模型操作(比如new、create、build)统一添加默认参数,和原来with_scope(:create => ...)的行为完全一致——块里执行的创建操作都会自动带上article_id和created_at这两个属性,不用手动在每个创建方法里传参。
如果你的代码是在某个模型的实例方法里,也可以明确指定模型类,让逻辑更清晰:
# 比如你在Article模型里,要给关联的Comment设置默认属性 Comment.with_options(article_id: article_id, created_at: created_at) do yield end
替换完记得跑一遍测试,确认创建的记录确实正确带上了这两个属性,避免因为上下文差异出现问题。
内容的提问来源于stack exchange,提问作者megha
相关产品推荐
相关产品推荐

