多くのフィールド、has_many
関連付け、追加された画像image_column
などを含む非常に複雑なモデルを使用しています...
新しいオブジェクトは、複数ページのフォーム (8 つの手順) によって追加されます - これらの手順の間で検証と伝達を行うにはどうすればよいですか?
validation_group
各ステップの検証を定義するのに役立つと思いますが、全体的な設計はどうですか?
多くのフィールド、has_many
関連付け、追加された画像image_column
などを含む非常に複雑なモデルを使用しています...
新しいオブジェクトは、複数ページのフォーム (8 つの手順) によって追加されます - これらの手順の間で検証と伝達を行うにはどうすればよいですか?
validation_group
各ステップの検証を定義するのに役立つと思いますが、全体的な設計はどうですか?
全体的な設計については、複雑なモデルや複数のモデルを処理するときにコントローラーを薄くしてビューを愚かに保つ方法として、プレゼンター レイヤーの概念を検討することをお勧めします (Jay Fields は彼のブログ エントリRails: Presenter Patternで定義しています)。
、 などの一連のメソッドを持つことができstep_1
、step_2
各メソッドは、前のステップから必要なデータが送信されたことを確認します。たとえば、ステップ 3 で、ステップ 1 で収集および解析されたすべてのデータに引き続きアクセスできるように、データをセッションに保存できます。最後のステップでは、セッションに保存したすべてのデータとデータを入れます。最後から2番目のステップから使用し、データベースまたはデータを収集する対象に新しい行を作成します。ユーザーがステップを間違えた場合は、前のステップにリダイレクトし、入力したデータをフォームに入力します。たとえば、ユーザーがステップ 2 を台無しにしてステップ 3 につながるフォームを送信した場合、step_3
メソッドで問題をキャッチし、ユーザーをstep_2
メソッドを使用して、ステップ 2 のフォーム要素が事前に入力されていることを確認してください。
進行中にセッションにデータを保存したくない場合は、ユーザーがステップ 1 を送信した後に新しいデータベース行を作成し、連続する各ステップで新しいデータを収集するときにその行のフィールドを更新するだけで済みます。行に「完了」のフラグを設定し、最初に 0 に設定し、ユーザーがすべての手順を正常に完了した後に 1 に設定することができます。
また、ユーザーが前のステップに進むことを許可することもできます (たとえば、ユーザーがステップ 5 にいるときにステップ 3 に戻れるようにする)。
最初のステップに「名前」と「メール」フィールドを持つフォームがあるとします。step_2
メソッドでは、 と が渡され、有効であることを確認する必要がparams[:name]
ありparams[:email]
ます。選択した方法で、それらをセッションまたはデータベース行に保存します。次に、ステップ 2 で、フィールド「年齢」と「性別」を含むフォームを作成します。step_3
メソッドでは、とparams[:age]
がparams[:gender]
渡されて有効であることを確認する必要があります。また、ユーザーが URL を入力してステップ 3 に直接アクセスできないようにするために、ユーザーがステップ 1 を完了していることを確認する必要もあります。等々。
class Campaign < ActiveRecord::Base
with_options(:if => lambda { |campaign| campaign.on_or_past_step(:spam_can) }) do |spam_can|
spam_can.validates_associated :spam_can
spam_can.validates_presence_of :spam_can
end
def on_or_past_step
:
:
end
end
これは進行中の作業ですが、正しい軌道に乗っているように感じます。AASM状態を使用して、実行する検証を決定しています。私の場合、問題のモデルはリソースであるため、ルートがどのように機能するかはまだわかりません。たとえば、どのフィールドのグループを編集アクションにする必要がありますか?