有没有办法让链接提交按钮运行一些自定义验证?
我需要帮助编写一个检查某些字段是否存在的验证,并且还要确保嵌套表单数组中至少有 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(用于简单的多步表单)