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中使用表单对象进行验证回调之前使用?
这意味着您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)
你能尝试一下吗?
| 归档时间: |
|
| 查看次数: |
2816 次 |
| 最近记录: |