10

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

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

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

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

  3. 还有其他建议吗?
4

1 回答 1

10

绝对#2ActiveModel::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.


有一个很棒的 gem 可以将您在 ActiveRecord 模型中使用的这个和其他常见功能转换为名为active_attr的通用非基于表的模型类。

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

于 2012-12-09T04:02:12.177 回答