10

モデルに基づいていないフォームを検証するための推奨されるアプローチは何だろうと思っていました。通常、すべての検証はモデルで行う必要があることに同意しますが、特定のフォームに対応するモデルがない場合があります。たとえば、任意の検索フォーム。

私の現在の調査に基づいて、私が見る限り、それを行うには主に2つの方法があります。

  1. コントローラーで検証します。
    • コントローラーでRailsバリデーションを利用することは可能ですか? 私は自分のカスタム コードよりもそれらを使用することを本当に好みます。

  2. 任意のクラスを作成します。呼び出さSearchFormれ、ActiveRecord::Validations
    • クラスをモデルと共に保存する必要がありますか (実際にはそうではありませんが)?
    • このアプローチを推奨する投稿では、save、save!、update_attribute などの ActiveRecord のメソッドをスタブ化する必要があることが示されました。

  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


ActiveRecord モデル内で使用するこの機能およびその他の一般的な機能を、 active_attrと呼ばれる一般的な非テーブルベースのモデル クラスに取得するための優れた gem があります。

ActiveAttr は、車輪を再発明することなく、ActiveRecord などの ORM に見られる機能を備えたプレーンな古い Ruby モデルを簡単に作成できるようにするモジュールのセットです。ActiveAttr は、ActiveModel が省略したものと考えてください。

于 2012-12-09T04:02:12.177 に答える