使用act-as-taggable-on进行自定义验证

时间:2012-10-28 15:46:08

标签: ruby-on-rails validation acts-as-taggable-on

您好我正在开发一个Rails 3项目,我正在使用act-as-taggable-on,一切运行完美! :)

我只有一个问题。

有谁知道如何将我的'自定义'验证添加到ActsAsTaggableOn :: Tag?我可以挂钩的任何回调(例如before_tag_save)?或类似的东西?

在我保存模型之前,我需要在tag_list中对每个'标签'运行一个正则表达式(以确保每个标签不包含任何非法字符),并且想知道是否有标准的方法。

我解决问题的方法是在我的PostController中添加一个验证方法,它只迭代标签列表并运行正则表达式,但这对我来说似乎很难看。

有什么建议吗?

提前谢谢! :)

3 个答案:

答案 0 :(得分:6)

我过去曾用过两种方式。一个通过自定义验证器,另一个通过验证调用。

自定义验证方法

在您的模型中,设置以下

  validate :validate_tag

  def validate_tag
    tag_list.each do |tag|
      # This will only accept two character alphanumeric entry such as A1, B2, C3. The alpha character has to precede the numeric.
      errors.add(:tag_list, "Please enter the code in the right format") unless tag =~ /^[A-Z][0-9]$/
    end
  end

显然,您需要在您的环境中使用更合适的内容替换验证逻辑和错误消息文本。

请记住,在这种情况下,您可以将每个标记评估为字符串。

标准验证方法

将此包含在您的模型中

validates :tag_list, :format => { :with => /^([A-Z][0-9],?\s?)*$/,
      :message => "Just too awesomezz" }

使用此方法,您必须记住,您正在验证看起来像字符串的整个数组。因此,您需要在标记之间允许使用逗号和空格。

选择最适合您的方法

答案 1 :(得分:0)

您可以使用before_save回调在模型中执行此操作。在那里你可以操纵(比方说)Post的标签,然后将它们保存在数据库中。

答案 2 :(得分:0)

您还可以在用户模型上重写标记方法:

  def tag(taggable, opts = {})
    return unless user.have? taggable.article
    super
  end

如果用户只能标记相同的文章(文章:has_many用户)

,那么它会非常有用