按下提交按钮后的自定义验证

时间:2013-09-03 23:11:42

标签: ruby-on-rails forms validation

有没有办法让link_to提交按钮运行一些自定义验证?

我需要帮助编写检查某些字段是否存在的验证,并确保嵌套表单数组中至少有4个条目。我使用gem cocoon作为嵌套表单,项目要求用户在申请表上附上至少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

多步问题表单是在创建用户后构建的。

例如,在我邪恶的表格的第二页上,我正在尝试验证高中名称validates :highschool, :presence => true的存在,但我仍然可以在最后一个提交页面上提交表单而没有填写高中。

SOLUTION:

我在用户上创建了一个名为“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

然后在我的user_steps控制器中处理将我的多个模型转换为单个多页面形式,我在更新方法中添加了以下内容:

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

因此,简单来说,正在发生的事情是,rails正在根据用户所处的表单步骤来跟踪用户。根据该步骤,我们可以运行特定于表单步骤的验证。

这对于我在extra_activity步骤中只需要最少4个问题这一事实很有用,但是我没有让我超越前面的步骤,因为验证不会让它。请记住,我们正在使用相同的模型。

使用的宝石:Cocoon(用于简单的嵌套表单)和Wicked(用于简单的多步骤表单)

1 个答案:

答案 0 :(得分: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