Rails验证非模型

时间:2012-12-09 03:33:33

标签: ruby-on-rails validation

我只是想知道基于模型验证的表单的建议方法是什么。我同意通常所有验证都应该在模型中完成,但有些情况下特定的表单可能没有相应的模型。例如,任意搜索表单。

根据我目前的研究,据我所知,有两种主要方法可以做到,

  1. 在控制器中验证。
    • 是否可以在控制器中使用Rails验证?我真的更愿意在我自己的自定义代码上使用它们。

  2. 创建一个任意类,例如。名为SearchForm并包含ActiveRecord::Validations
    • 该类是否应与模型一起存储(即使它不是真的)?
    • 推荐这种方法的帖子表明你必须为ActiveRecord隐藏一堆方法,例如save,save!,update_attribute等。这让我觉得不是很像Rubyesque!

  3. 还有其他建议吗?

1 个答案:

答案 0 :(得分:10)

绝对#2 。您正在寻找 ActiveModel::Validations API

class ArbitrarySearch
  include ActiveModel::Validations

  attr_accessor :query

  validate :query, :presence
end

至于应该去哪里,是的,它应该进入app/models。如果您像我一样认为扩展ActiveRecord::Base的模型和不在同一目录中共存的模型混合起来很有趣,请考虑在您的config/application.rb文件中添加以下内容

config.autoload_paths += Dir["#{config.root}/app/models/**/"]

现在,您可以按照自己喜欢的方式组织模型文件。对我来说,我有

- app
  |
  |- models
     |
     |- table
     |- tableless
     |- observer

我将ArbitrarySearch班级的课程放到app/models/tableless/arbitrary_search.rb


将ActiveRecord模型中使用的此功能和其他常用功能转换为名为 active_attr 的通用非基于表的模型类,有一个很棒的宝石。

  

ActiveAttr是一组模块,可以轻松创建具有ORM中功能的普通旧ruby模型,如ActiveRecord,而无需重新发明轮子。将ActiveAttr视为ActiveModel遗漏的东西。