1

当通过继承定义Trailblazer操作时,它会继承其超类的协定:

class Create < Trailblazer::Operation
  contract do 
    ... 
  end
  ...
end

class Update < Create
  ...
end

继承的 Trailblazer 操作的合约可以更改其超类定义的验证吗?

之所以出现这个问题,是因为创建操作的合同定义了一个强制属性,该属性需要在更新操作中是可选的:

validates :foo, presence: true

最初的想法是在继承的类中以某种方式颠倒这个定义,但似乎没有办法做到这一点(可以忽略子类中的属性(writeable:false-p61)但似乎没有办法更改其有效性标准)。

4

2 回答 2

1

一种解决方案是在每个操作的合同中使用外部表格。通过将表单提取到外部类,创建操作将包含并扩充它,如下所示:

contract Form do
  validates :upload, presence: true
end 

并且更新操作会将其简单地包括为:

contract Form

现在添加的验证Create不适用于Update.

于 2016-02-26T10:22:53.123 回答
0

if您可以通过向验证器添加语句来实现您想要的结果:

class Create < Trailblazer::Operation
  contract do
    validates :upload, presence: true, if: Proc.new{ |record| !record.persisted? }
  end
end
class Update < Create
end

仅当记录尚未持久化到数据库时才会运行验证,因此在更新操作期间将跳过它。(这假设您正在使用 ActiveModel 并遵循正常的 CRUD 使用模式。)

于 2016-05-18T15:39:00.077 回答