在将数据保存到数据库之前尝试将.slice数据保存到数据库中,但它不起作用

时间:2016-06-15 05:49:23

标签: ruby-on-rails ruby ruby-on-rails-4 model friendly-id

如果key_type4,我正试图让段塞长度小于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://会更容易。

有人可以帮助解释为什么这不起作用。

2 个答案:

答案 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