基于ActiveRecord验证错误的决策

时间:2011-11-09 16:27:02

标签: ruby-on-rails validation activerecord activemodel

我对rails非常陌生,我想知道最好的方法是:

我有一个控制器在数据库中创建记录。

如果发生特定的验证错误,我想设置一个标志,我看不出用我熟悉的rails模式来实现这个目标的好方法。

我想要检测的模型验证是:

validates_uniqueness_of :title

我的控制器正在执行此操作:

fcs = Entity.create(:title => text)

当上述错误失败时,我有一个ActiveModel错误集合可供使用。

我应该如何可靠地设置一个标志,以编程方式指示标题已被拍摄?

到目前为止,我已经考虑了

fcs.errors.messages.has_key?(:title)

但如果由于其他原因导致冠军失败,这将返回true。所以我需要更多的东西:

fcs.errors.messages[:title]==["has already been taken"]

但这可能是一个维护问题,并且也会被不同的语言环境打破......

所以有人知道如何使用RoR完成这项工作吗?

感谢您的任何建议

编辑:建议标志“is_title_duplicated”的示例用法:

if(! fcs.errors.empty?)
      json['success']=false
      json['errors']=fcs.errors.full_messages
      json['title_was_duplicate'] = is_title_duplicated
      render :json => json

...

2 个答案:

答案 0 :(得分:2)

我建议在模型类中添加一个方法来检测唯一性。

class Entity < ActiveRecord::Base
  def unique_title?
    Entity.where(:title => title).count > 0
  end
end

当然,这意味着您要运行该查询两次(一次针对validates_uniqueness_of,一次针对unique_title?)。只要性能可以接受,我更喜欢可读性而不是性能。如果性能不可接受,您仍然可以选择。您可以在自己的自定义验证中重复使用unique_title?并缓存结果。

class Entity < ActiveRecord::Base
  validate :title_must_be_unique

  def unique_title?
    # you may want to unset @unique_title when title changes
    if @unique_title.nil?
      @unique_title = Entity.where(:title => title).count > 0
    end
    @unique_title
  end

  private

  def title_must_be_unique
    unless unique_title?
      errors.add(:title, I18n.t("whatever-the-key-is-for-uniqueness-errors"))
    end
  end
end

答案 1 :(得分:1)

你的意思是在唱片上设置一个标志?每当验证失败时,记录都不会保存到数据库

如果您只是设置错误消息,则不必。 Rails会自动将fsc.erros设置为类似{:title =&gt;的哈希值。 “标题已被采用”}。您可以通过将:message传递给验证来指定该消息。

此外,您可以使用l18n将消息国际化。只需编辑yaml文件,如下所述: http://guides.rubyonrails.org/i18n.html#configure-the-i18n-module