1

嗨,我正在做一个 Rails 3 项目,我正在使用acts-as-taggable-on,一切都很完美!:)

我只有一个问题。

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

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

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

有什么建议么?

先感谢您!:)

4

3 回答 3

8

我以前用过两种方法。一个通过自定义验证器,另一个通过 validates 调用。

自定义验证方法

在您的模型中,设置以下内容

  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" }

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

选择最适合您的方法

于 2012-11-05T06:22:48.830 回答
0

您可以通过before_save回调在模型中执行此操作。在那里,您可以在将 Post 的标签保存到数据库之前对其进行操作。

于 2012-10-28T15:53:17.643 回答
0

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

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

如果用户只能标记同一篇文章(文章:has_many users),这可能会很有用

于 2015-07-14T01:56:22.963 回答