【问题标题】:Custom validation after submit button is pressed按下提交按钮后的自定义验证
【发布时间】:2013-09-03 23:11:42
【问题描述】:

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

我需要帮助编写一个检查某些字段是否存在的验证,并且还要确保嵌套表单数组中至少有 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 =&gt; 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(用于简单的多步表单)

【问题讨论】:

  • 这些验证是否总是应该强制执行,还是仅在提交此特定表单时才强制执行?
  • @ArtinBoghosian 提交表单后。

标签: ruby-on-rails forms validation


【解决方案1】:

如果应该始终强制执行这些验证,我的意思是每当您尝试保存应用程序时,它必须至少有 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 的值。我不是这种方法的忠实拥护者,但它既快速又简单。除此之外,我认为您必须创建某种 Facade 对象或表单对象,该对象或表单对象位于此 ActiveRecord 模型前面并执行表单所需的验证。

class AppForm
  include ActiveModel::Validation

  # move validations code here
end

【讨论】:

  • 由于某种原因它对我不起作用。可能是因为视图连接到我设置的多步控制器?
  • 您能否也发布您的控制器代码,以便我了解您如何实际使用表单数据?
  • @DillonRaphael 是用户模型上的高中名称?
  • Question 是 App 的嵌套属性
  • @DillonRaphael 这似乎是一件阴暗的事情,但是您可以通过将 if 语句更改为 if app.questions.count
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 2017-09-20
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多