1

Trailblazer操作が継承によって定義されると、そのスーパークラスのコントラクトが継承されます。

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

class Update < Create
  ...
end

継承された Trailblazer 操作のコントラクトは、そのスーパークラスによって定義された検証を変更できますか?

この疑問が生じたのは、作成操作のコントラクトが、更新操作でオプションにする必要がある必須プロパティを定義したためです。

validates :foo, presence: true

最初の考えは、継承されたクラスでこの定義を何らかの形でにすることでしたが、これを行う方法はないようでした(サブクラスのプロパティを無視するwriteable:falseことは可能です( - book p61)が、方法がないようですその妥当性基準を変更します)。

4

2 に答える 2

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 に答える