使用activevalidators gem实现Rails slug验证,测试未生效如何解决?
解决Rails中
parameterize自动处理的测试问题 首先得明确一个关键点:你用的activevalidators的slug: true验证仅用于校验字段是否符合slug格式,它不会自动修改字段的值——这就是你的测试失败的核心原因!它只会在输入不符合slug规则时触发验证错误,不会帮你把"murtis smith"转换成"murtis-smith"。
正确的实现方式
要实现保存时自动将name转换为slug格式,你需要在模型中添加一个回调方法,比如before_save,手动调用parameterize处理字段:
class Player < ApplicationRecord validates :name, allow_nil: true, slug: true # 保留验证,确保最终格式合法 before_save :slugify_name private def slugify_name self.name = name.parameterize if name.present? end end
这样当你执行player.save时,回调会自动把name转换成slug格式,你的测试代码就能顺利通过了。
是否需要避免activevalidators gem?
完全没必要放弃它——如果你的需求是确保name字段最终是合法的slug格式,这个gem的验证功能还是很有用的。它能帮你拦截那些没被正确转换(或者手动修改后不符合规则)的字段值。但如果你的需求只是生成slug,那你完全可以不用这个gem,只靠回调就能完成;两者结合使用的话,既能自动生成,又能做格式校验,效果更好。
内容的提问来源于stack exchange,提问作者kdweber89
相关产品推荐
相关产品推荐

