有没有办法让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(用于简单的多步骤表单)
答案 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