0

link_to submit ボタンにカスタム検証を実行させる方法はありますか?

特定のフィールドの存在をチェックする検証を作成するのに助けが必要です。また、ネストされたフォーム配列に少なくとも 4 つのエントリがあることを確認してください。ネストされたフォームに宝石の繭を使用しており、プロジェクトでは、ユーザーがアプリケーション フォームに少なくとも 4 つの質問を添付する必要があります。

私の協会は次のとおりです。

class App < ActiveRecord::Base
  belongs_to :user
  has_many :questions, :dependent => :destroy
end


class Question < ActiveRecord::Base
  belongs_to :app
end

マルチステップコントローラー:

class UserStepsController < ApplicationController
  include Wicked::Wizard

  steps :personal, :school, :grades, :extra_activity, :paragraph, :submit

  def show
    @user = User.find(current_user)
      case step
    when :school, :grades, :extra_activity, :paragraph, :submit
    @question = Question.find(current_user)
  end
    render_wizard
  end

  def update
    @user = User.find(current_user)
    @user.update_attributes(user_params)
    case step
    when :school, :grades, :extra_activity, :paragraph, :submit
    @question =  Question.find(current_user)
    @question.update_attributes(question_params)
    end

    render_wizard @user
  end

ユーザーが作成されると、複数ステップの質問フォームが作成されます。

たとえば、私の邪悪なフォームの 2 ページ目で、高校名の存在を検証しようとしてvalidates :highschool, :presence => true いますが、最後の送信ページで高校を記入せずにフォームを送信できます。

解決:

文字列である「steps」というユーザーに移行を作成しました。

次に、次のコードをユーザー モデルに追加します。

class App < ActiveRecord::Base
  validate :minimum_number_of_questions_required, if: "step == 'extra_activity'"

  private

  def minimum_number_of_questions_required
    if questions.count < 4
      errors[:base] << "You must have at least 4 questions attached."
    end
  end
end

次に、複数のモデルを 1 つの複数ページ フォームに変換する user_steps コントローラーで、update メソッドに次のコードを追加しました。

case step
when :extra_activity
  @user.step = step.to_s
end

簡単に言えば、フォームのどのステップにいるかに基づいてレールがユーザーを追跡しているということです。ステップに基づいて、フォーム ステップに固有の検証を実行できます。

これは、extra_activity ステップで最小 4 つの質問しか必要ないという事実に役立ちますが、検証で許可されなかったため、前のステップを通過できませんでした。同じモデルで作業していることを思い出してください。

使用する Gem: Cocoon (単純なネストされたフォームの場合) および Wicked (単純な複数ステップのフォームの場合)

4

1 に答える 1

0

これらの検証を常に実施する必要がある場合、つまり、アプリを保存しようとするたびに少なくとも 4 つの質問が必要な場合は、次のように追加します。

class App < ActiveRecord::Base
  validate :minimum_number_of_questions_required

  private

  def minimum_number_of_questions_required
    if questions.count < 4
      errors[:base] << "You must have at least 4 questions attached."
    end
  end
end

そのフォームが送信されたときにのみ発生させたい場合は、App クラスに変数を設定して、オブジェクトが実際に最小限の質問の検証を実行する必要があることを知らせることができます。

class App < ActiveRecord::Base
  attr_accessor :validate_questions

  validate :minimum_number_of_questions_required, if: :validate_questions

  # same code as above for validation
end

コード/フォームで validates_question 変数が true と評価される値に設定されていることを確認する必要があります。私はこの方法の大ファンではありませんが、すばやく簡単です。それ以外では、この ActiveRecord モデルの前に置かれ、フォームに必要な検証を行う、ある種の Facade オブジェクトまたはフォーム オブジェクトを作成する必要があると思います。

class AppForm
  include ActiveModel::Validation

  # move validations code here
end
于 2013-09-03T23:46:36.000 に答える