0

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

我需要帮助编写一个检查某些字段是否存在的验证,并且还要确保嵌套表单数组中至少有 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 ,但我仍然能够在没有填写高中的情况下在最后提交页面上提交表格。

解决方案:

我在用户上创建了一个名为“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(用于简单的多步表单)

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 回答