2017-12-29 24 views
0

나는 다음과 같이 간단한 선구자 조작이는 :선구자 작동 정의되지 않은 메서드`전화 'NilClass

irb(main):003:0> User::Delete.() 
NoMethodError: undefined method `call' for nil:NilClass 
    from (irb):3 
:

class User::Delete < Trailblazer::Operation 
    extend Contract::DSL 

    contract 'params' do 
    property :token 

    validates :token, presence: true 
    end 

    step Contract::Validate(name: 'params'), before: 'operation.new' 
    success :kill_zombie 

    def kill_zombie(options, params:, **) 
    options['killed'] = true 
    end 

end 

내가 레일 콘솔에서 작업을 실행, 그 출력의

class User::Delete < Trailblazer::Operation 
    extend Contract::DSL 

    contract 'params' do 
    property :token 

    validates :token, presence: true 
    end 

    success :kill_zombie 

    def kill_zombie(options, params:, **) 
    options['killed'] = true 
    end 

end 
:

나는 계약 라인을 제거하는 경우

그것은 같이 기대 작품 :

irb(main):005:0> User::Delete.() 
=> <Result:true <Skill {"killed"=>true} {"params"=>{}} {"pipetree"=>[>operation.new,>kill_zombie], "contract.params.class"=>#<Class:0x0000000003e54e50>}> > 
irb(main):006:0> 

어떤 생각?

답변

2

개혁 계약을 사용하는 경우 Contract::Validate 전에 Contract::Build이 필요합니다. Dry 스키마를 사용하면 빌드 단계가 필요하지 않습니다.

+0

스 니펫 코드를 제공 할 수 있습니까 (문서에서 중복 되더라도)? –

1

나는 메시지가 you are trying to call a method on a nil object 있음을 의미 문서 http://trailblazer.to/gems/operation/2.0/contract.html

에 깊이 파고 것입니다.

오브젝트는 User::Delete이며, 방법은 유효성 검사를 통과하지 않기 때문에 .()

User::Delete.() 

User::Delete가 정의 될 수있다?

step Contract::Validate(name: 'params'), before: 'operation.new' 

몇 가지 의견을 제공하기 위해 게시했지만 해결책이 없습니다. 메소드를 호출하기 전에 User::Delete을 검사 할 것입니다.

User::Deletenil이 될 것이므로 유효성을 변경하거나 개체가 올바르게 인스턴스화되어 있어야합니다.

+0

그냥, 내가 선형 검증을 위해 –

+0

@JeremieGes을 건조 :: 검증을 사용해야 할 것 같은 느낌 문서에 파고 예'같은'(드라이 :: Validation.Schema가 요구 (DO ID가) 끝을 .filled) http://trailblazer.to/gems/operation/2.0/contract.html#dry-schema –