如何在Rails 4中使用表单对象进行验证回调之前使用?

lea*_*otk 5 ruby callback ruby-on-rails-4

我有一个服务模型/表及其注册表.

在表单中我几乎有所有服务的字段,但其中一些我想在验证服务对象之前自动设置一个值.

  • 例:

- 服务控制器#create动作:

def create
  @service = Service.new
  @service_form = ServiceFormObject.new(@service)

  @service_form.validate(params[:service_form_object]) and @service_form.save
  respond_with(@service_form, location: admin_services_path)
end
Run Code Online (Sandbox Code Playgroud)

在验证@service_form对象之前,我想要设置@service_form duration_in_hours字段.所以我尝试使用该代码:

- 服务模式:

# Callbacks
  before_validation :set_duration

# Instance methods
private
  def set_duration
    self.duration_in_hours = (self.end_at - self.start_at) / 3600
  end
Run Code Online (Sandbox Code Playgroud)

但是set_duration方法没有运行(我把'byebug'gem用于查看方法是否运行).

我认为问题在于我使用表单对象(+ reform gem)创建表单:我使用表单对象来验证服务字段,在服务模型中使用intsead验证.

class ServiceFormObject < BaseFormObject
Run Code Online (Sandbox Code Playgroud)

BaseFormObject继承自Reform :: Form:

class BaseFormObject < Reform::Form
Run Code Online (Sandbox Code Playgroud)

我试图将before_validation和方法放在ServiceFormObject类中,但是我收到了一个错误:ServiceFormObject的未定义方法`before_validation':Class

如何在Rails 4中使用表单对象进行验证回调之前使用?

dgi*_*rez 8

这意味着您ServiceFormObject不包含验证回调.

假设它Reform::Form确实处理ActionModel验证(包括ActionModel::Validations),我会尝试将ActiveModel::Validations::Callbacks模块包含在您的中ServiceFormObject,或者甚至更好地包含在您的BaseFormObject:

class BaseFormObject < Reform::Form
  include ActiveModel::Validations::Callbacks

  #...
end
Run Code Online (Sandbox Code Playgroud)

你能尝试一下吗?