如果key_type
为4
,我正试图让段塞长度小于20。
在模型中我有
validate :text_slug_length
def text_slug_length
if key_type == 4
slug.slice(0, 19)
end
end
但这不会引发任何错误,但也无法正常工作。不知道为什么......
slug不用于key_type
4
的值。 key_type
4
key_type
的数据可能是长文本块,因此当它试图保存一个非常长的slug时会导致长度错误。我可以以某种方式不保存4
.slice
的一个slug,但这种方式也将阻止生成长slu的错误,我认为http://
会更容易。
有人可以帮助解释为什么这不起作用。
答案 0 :(得分:0)
您没有指定切片值。
validate :text_slug_length
def text_slug_length
if key_type == 4
self.slug = slug.slice(0, 19)
end
end
您可能希望首先检查{n}值是否为slug
。
现在这看起来不像验证(它不会将属性标记为错误,它会纠正它们)但会修改用户输入。 D建议您使用before_validation
代替(并且可能添加一个真正的验证,但这不是必需的,因为您确保不会超过slug长度。)
before_validation :slice_slug
validates :slug, length: {maximum: 20}, if: :validate_slug_length?
def slice_slug
self.slug = slug.slice(0, 19) if slug.present? && validate_slug_length?
end
def validate_slug_length?
key_type == 4
end
答案 1 :(得分:0)
如果数据不好,验证通常会向模型添加错误。这似乎不是你想要的;如果模型key_type == 4
,你只想截断slu ,,对吗?怎么样:
before_validation :truncate_slug
def truncate_slug
self.slug = slug.try!(:slice, 0, 19) if key_type == 4
end