通常、Rails でフォーム ヘルパーを使用する場合、各フィールドは適切なオブジェクトのメソッドに直接関連付けられます。
ただし、ユーザー モデル自体の一部ではないフィールド (カードの詳細など) を含める必要があるフォーム (ユーザー サインアップ) がありますが、表示する必要があります。
ユーザーモデルを汚さずに、必要なフィールドを取得し、必要に応じて (他のすべての検証に適合するように) 検証できるように、フォームを構築するにはどうすればよいでしょうか?
通常、Rails でフォーム ヘルパーを使用する場合、各フィールドは適切なオブジェクトのメソッドに直接関連付けられます。
ただし、ユーザー モデル自体の一部ではないフィールド (カードの詳細など) を含める必要があるフォーム (ユーザー サインアップ) がありますが、表示する必要があります。
ユーザーモデルを汚さずに、必要なフィールドを取得し、必要に応じて (他のすべての検証に適合するように) 検証できるように、フォームを構築するにはどうすればよいでしょうか?
ユーザーモデルを「ダーティにする」とはどういう意味かわかりませんが、attr_accessor メソッドを使用してこれを行うことができます。これにより、検証に使用できるモデルの属性を作成できます。
class Widget < ActiveRecord::Base
attr_accessor :confirmation_email
validates_length_of :confirmation_email, :within => 1..10
end
:if
特定の時間にのみ検証を実行するには、条件を使用できます。
validates_length_of :confirmation_email, :within => 1..10, :if => Proc.new { |widget| widget.creation_step > 2 }
次のようなクラス メソッドを使用することもできます:if => :payment_complete
。これらを使用すると、必要な機能を実現できるはずです。私の知る限り、これ以上簡潔な方法はありません。
Yehuda Katzは、任意のクラスをRailsのフォームヘルパーと互換性のあるものにするためにどのように使用できるかについての優れた説明をしています。ActiveModel
ただし、これはRails3を使用している場合にのみ機能します。
最先端に住んでいない場合は、Railscastsのエピソード193「テーブルレスモデル」ActiveRecord::Base
をご覧ください。このエピソードでは、で動作するように十分にクワクワクするクラスを作成する方法について説明していますform_for
。