当通过继承定义先驱者操作时,它继承其超类的契约:
class Create < Trailblazer::Operation
contract do
...
end
...
end
class Update < Create
...
end继承的开拓者操作的合同能否改变其超类?定义的有效性?
之所以会出现这个问题,是因为create操作的契约定义了一个必须在更新操作中可选的强制属性:
validates :foo, presence: true最初的想法是在继承的类中以某种方式逆转这一定义,但似乎没有办法做到这一点(可以忽略子类中的属性(writeable:false - 书 p61),但似乎没有办法更改其有效性标准)。
发布于 2016-02-26 10:22:53
一种解决方案是在每个操作的合同中使用外部形式。通过将表单提取到外部类,create操作将包括并增强它,如下所示:
contract Form do
validates :upload, presence: true
end 更新疗养将简单地包括如下内容:
contract Form现在,Create中添加的验证不适用于Update。
发布于 2016-05-18 15:39:00
您可以通过向验证器添加一个if语句来实现您想要的结果:
class Create < Trailblazer::Operation
contract do
validates :upload, presence: true, if: Proc.new{ |record| !record.persisted? }
end
end
class Update < Create
end只有在尚未将记录持久化到数据库的情况下,才会运行验证,因此在Update操作期间将跳过它。(这假设您使用的是ActiveModel,并遵循正常的CRUD使用模式。)
https://stackoverflow.com/questions/35648619
复制相似问题