在将模型保存到数据库之前尝试对模型中的数据进行切片,但它不起作用

Trying to .slice data in the model before it is saved to the db but it isn't working

如果 key_type4,我试图让 slug 长度小于 20。

在我的模型中

validate :text_slug_length

def text_slug_length
 if key_type == 4
   slug.slice(0, 19)
 end

end

但这不会引发任何错误,但也不起作用。不知道为什么...

slug 不用于 key_type4 的值。 key_type4 的数据可以是长文本块,因此在尝试保存非常长的 slug 时会导致长度错误。我无法以某种方式保存 key_type 4 的 slug,但这种方式也将阻止生成长 slug 的错误,我认为 .slice 会更容易。

谁能帮忙解释为什么这不起作用。

您没有分配切片值。

validate :text_slug_length

def text_slug_length
  if key_type == 4
    self.slug = slug.slice(0, 19)
  end
end

您可能需要先检查 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

如果数据不好,验证通常会给模型添加错误。看起来这不是你想要的;如果模型的 key_type == 4,您只想截断 slug,对吗?怎么样:

before_validation :truncate_slug

def truncate_slug
  self.slug = slug.try!(:slice, 0, 19) if key_type == 4
end