使用模型进行自定义验证:保存失败

时间:2010-12-19 17:18:41

标签: ruby-on-rails validation

我没有在网上找到任何好的例子,所以我想问一个简单的问题,我希望得到一个简单的答案。要温柔。 :)

我有一个Post模型。

p = Post.find(1)
p.title = "This is the Title of this Article"
p.url_title = "this-is-the-title-of-this-article--created-by-user-name"

创建帖子后,我根据标题创建:url_title。这就是我在数据库中关闭它的方式,而不是暴露同样无聊且无描述性的ID。

我在before_save中构建了这个:url_title,这就是为什么我不能简单地使用'validates_uniqueness_of',因为看起来验证是在before_save启动之前完成的,并且有一个:url_title来验证。

所以,我需要确保:url_title是唯一的。我附加了“--created-by - #{p.user.name}”,以允许不同用户对同一标题进行多次使用。

因此,我需要做的是进行自定义验证,确认:url_title在保存之前对数据库是唯一的,如果它不是唯一的,则会引发错误并通知用户。

关于最佳方法的想法? “

3 个答案:

答案 0 :(得分:2)

您可以将回调从before_save移至before_validation(请参阅here)。此回调将在创建和更新操作上运行,因此我认为它足以满足您的需求。

答案 1 :(得分:1)

使用它来创建url_title

before_validation_on_create :create_url_title

....

private

def create_url_title
  url_title = .....
end

然后将适当的验证添加到url_title

validate_uniqueness_of :url_title, :message => "This title is taken, please choose a different title"

答案 2 :(得分:0)

添加

validates_uniqueness_of :url_title
在你的帖子模型中