2016-10-15 6 views
1

콜백이 throw(:abort) 인 모델이 주어 졌을 때 콜백 자체를 수정하지 않고 의 콜백을 어떻게 결정할 수 있습니까??Rails 5에서 호출 된 콜백 (callback)을 확인하십시오.

class OddDuck < ApplicationRecord 
    before_save :random_abort_1 
    before_save :random_abort_2 

    private 

    def random_abort_1 
    if Random.rand(2) == 1 
     throw(:abort) 
    end 
    end 

    def random_abort_2 
    if Random.rand(2) == 1 
     throw(:abort) 
    end 
    end 
end 

... 때로는 저장 실패합니다 예를 들어

, 다음 모델 ...

$ rails c 
Running via Spring preloader in process 81303 
Loading development environment (Rails 5.0.0.1) 
irb(main):001:0> OddDuck.create! 
    (0.1ms) begin transaction 
    (0.1ms) rollback transaction 
ActiveRecord::RecordNotSaved: Failed to save the record 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/persistence.rb:152:in `save!' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/validations.rb:50:in `save!' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/attribute_methods/dirty.rb:30:in `save!' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:324:in `block in save!' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:211:in `transaction' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:392:in `with_transaction_returning_status' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:324:in `save!' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/suppressor.rb:45:in `save!' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/persistence.rb:51:in `create!' 
    from (irb):1 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/console.rb:65:in `start' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/console_helper.rb:9:in `start' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:78:in `console' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands.rb:18:in `<top (required)>' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `block in require' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require' 
    from /Users/alice/Desktop/site/bin/rails:9:in `<top (required)>' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `block in load' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
    from /Users/alice/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
    from -e:1:in `<main>' 

...하지만 역 추적에서 명백하지 않다 어떤 콜백은 중단을 야기했다.

답변

1

throw도 선택적 반환 값을 허용하므로 throw을 트리거 한 콜백을 알아야하는 경우 사용할 수 있습니다.

드로우 (태그 [OBJ])
환승 tag 대기중인 catch 블록의 끝에 제어한다. tag에 대해 catch 블록이 없으면 UncaughtThrowError을 발생시킵니다. 선택적 두 번째 매개 변수는 catch 블록에 대한 반환 값을 제공하며, 그렇지 않은 경우 기본값은 nil입니다. 예를 들어
https://ruby-doc.org/core-2.4.1/Kernel.html#method-i-throw

:

def random_abort_1 
    if Random.rand(2) == 1 
    throw(:abort, __method__) 
    end 
end 

random_abort_1를 반환합니다.

+0

+1 원래 질문에 대한 온 - 포인트 대답. 당신의 대답을보고 나는 그 질문이 명확해질 필요가 있음을 깨달았습니다. 질문을 업데이트했습니다. – kkurian

+0

@kkurian 제 대답을 업데이트하여'model_name # action_name'이 던지기를 시작한 것을 알려줍니다. 그게 네가 쫓아 온거야? – Turgs

+0

네, 그렇습니다. – kkurian