我有一个服务模型/表及其注册表。
在表格中,我几乎拥有所有服务的字段,但其中一些我想在验证服务对象之前自动设置一个值。
- 服务控制器#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中使用表单对象进行验证回调之前使用?
答案 0 :(得分:6)
这意味着您的ServiceFormObject
不包含验证回调。
假设Reform::Form
确实处理ActionModel
次验证(包括ActionModel::Validations
),我会尝试将ActiveModel::Validations::Callbacks
模块纳入您的ServiceFormObject
甚至更好地进入BaseFormObject
:
class BaseFormObject < Reform::Form
include ActiveModel::Validations::Callbacks
#...
end
你可以尝试一下吗?