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

时间:2015-01-07 19:07:16

标签: ruby ruby-on-rails-4 callback

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

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

  • 示例:

- 服务控制器#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

在验证@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

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

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

class ServiceFormObject < BaseFormObject

BaseFormObject继承自Reform :: Form:

class BaseFormObject < Reform::Form

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

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

1 个答案:

答案 0 :(得分:6)

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

假设Reform::Form确实处理ActionModel次验证(包括ActionModel::Validations),我会尝试将ActiveModel::Validations::Callbacks模块纳入您的ServiceFormObject甚至更好地进入BaseFormObject

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

  #...
end

你可以尝试一下吗?