1

誰かが私に、検証を使用してウィザードスタイルのフォームを作成する方法を説明できますか?

fe:

名前、開始時刻、終了時刻、住所、都市のデータを含む予定モデルがあります。

ここで、データグループごとに3つのアクションが必要です。

  1. 名前
  2. 開始日と終了日
  3. アドレスフィールド

それらのそれぞれにアクセスできる必要があります(したがって、AASMはオプションではないと思います-> model.wizard_step = 3であり、このステップに適切なビューを生成するだけでは不十分です)。

そして、それらのそれぞれに検証が必要です

  1. 名前はnilであってはなりません
  2. 開始日は終了日より後であってはなりません
  3. アドレスフィールドはnilであってはなりません

しかし、単一のステップの間にこのオブジェクトを保存するにはどうすればよいですか?また、この検証スキーマ/グループを組み込む方法は...?

heeelp ..ありがとう=)

4

4 に答える 4

3

これには、グループ化された検証gemを使用できます:https ://github.com/adzap/grouped_validations

于 2011-04-19T16:58:35.657 に答える
1

フォームに非表示のフィールドを組み合わせる:

f.hidden_field :wizard_stage, :value => '<current action>'

このようなもので

class Appointment < ActiveRecord::base

   attr_accessor :wizard_stage

   validates_presence_of :name, :if => lambda{|a| a.wizard_stage == 'name'}
   validates_presence_of [:start, :end], :if => lambda{|a| a.wizard_stage = 'dates'}
end
于 2009-06-16T21:22:24.237 に答える
0

あなたは基本的にこれで「あなた自身を転がす」必要があるでしょう。標準のRails/ActiveRecord機能で取得できる最も近い方法は、次のようなことを行うことです。

class WizardController < ApplicationController
  def wizard_1
    foo = Foo.new params[:foo]
    foo.valid?

    if %{name}.any? {|att| foo.errors.on(att) }
      # failed pseudo-validation
    else
      render :wizard_2
    end
  end

  def wizard_2
    foo = Foo.new params[:foo]
    foo.valid?

    if %{name startdate enddate}.any? {|att| foo.errors.on(att) }
      # failed pseudo-validation
    else
      render :wizard_3
    end
  end

  def wizard_3
    # standard rails Controller#create
  end
end

そして、各ステップの変数を次の非表示フィールドに渡す必要があります。また、これを3段階ではなく、1段階で行うことを検討することもできます。

于 2009-06-04T12:58:08.577 に答える
0

:ifだけを使用することはできませんか?

例えば

validates_presence_of :name
validates_presence_of :address_fields, :if => Proc.new {|p| p.startdate && p.enddate}

def validate
  unless name.blank?
    errors.add(:startdate) if startdate > enddate 
  end
end
于 2009-06-04T13:00:59.163 に答える