首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承的开拓者的合同能改变它的超类定义的有效性吗?

继承的开拓者的合同能改变它的超类定义的有效性吗?
EN

Stack Overflow用户
提问于 2016-02-26 10:00:40
回答 2查看 142关注 0票数 1

当通过继承定义先驱者操作时,它继承其超类的契约:

代码语言:javascript
复制
class Create < Trailblazer::Operation
  contract do 
    ... 
  end
  ...
end

class Update < Create
  ...
end

继承的开拓者操作的合同能否改变其超类?定义的有效性?

之所以会出现这个问题,是因为create操作的契约定义了一个必须在更新操作中可选的强制属性:

代码语言:javascript
复制
validates :foo, presence: true

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-26 10:22:53

一种解决方案是在每个操作的合同中使用外部形式。通过将表单提取到外部类,create操作将包括并增强它,如下所示:

代码语言:javascript
复制
contract Form do
  validates :upload, presence: true
end 

更新疗养将简单地包括如下内容:

代码语言:javascript
复制
contract Form

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

票数 1
EN

Stack Overflow用户

发布于 2016-05-18 15:39:00

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

代码语言:javascript
复制
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使用模式。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35648619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档