質問

多くのフィールド、 has_many の関連付け、 image_column によって追加された画像などの非常に複雑なモデルを使用しています...

新しいオブジェクトは複数ページのフォーム(8ステップ)によって追加されます-これらのステップ間の検証と伝播をどのように達成すればよいですか?

validation_group は各ステップの検証を定義するのに役立つと思いますが、全体的な設計はどうですか?

役に立ちましたか?

解決

全体的な設計については、プレゼンターレイヤーの概念を検討することをお勧めします(Jay Fieldsは、ブログエントリレール:プレゼンターパターン)を使用して、複雑なモデルや複数のモデルを扱う際にコントローラーを薄くし、ビューを愚かにします。

他のヒント

次のような一連のメソッドを使用できます。 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] が渡されて有効であることを確認する必要があります。また、ユーザーがステップ3に直接アクセスするためにURLを入力できないように、ユーザーがステップ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 の状態を使用して、実行する検証を決定しています。私の場合の問題のモデルはリソースであるため、ルートがどのように機能するかについてはまだ解決していません。たとえば、どのフィールドグループを編集アクションにする必要がありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top