Trailblazer仅在“步骤宏”时生成加载错误。用

时间:2017-06-24 22:32:25

标签: trailblazer

我遇到了Trailblazer-Rails应用的加载问题。我可以使用require来解决加载问题,但是,根据trailblazer-loader's自述文件,我似乎不需要使用`require。

我的应用程序有一个像这样的文件结构

app
-|concepts
---|email_address
-----|person
-------|operation
---------|test.rb
-----|schema
-------|create.rb

我的理解是app > concepts > email_address > schema > create.rb应该在app > concepts > email_address > person > operation > test.rb之前加载,基于嵌套级别和最后加载operations的事实。

到目前为止,在email_address > schema > create.rb的方法中引用email_address > person > operation > test.rb并未导致任何问题。

我已决定干掉我的代码,然后添加引用email_address > schema > create.rb的{​​{3}},这会导致自动加载问题(具体来说,app/concepts/email_address/schema/create.rb:2:in '<class:EmailAddress>': Schema is not a class (TypeError))。

我可以通过使用require指定加载或在email_address > person > operation > test.rb内移动email_address > schema > new_folder > test.rb来修复此错误(在这种情况下,加载正常工作而不需要请求)。

关于我使用step Macro的原因是什么改变了需要加载的顺序?我试图了解发生了什么。

以下是相关代码:

module Macro
  def self.ValidateParams(schema:)
    step = ->(input, options) { 
      unless input[:validate] == false
        options['contract.default'] = schema.(input['params'])
        options[:params] = options['contract.default'].output
        options['contract.default'].success? && input['current_user']
      else
        options[:params] = params
      end
    }

    [ step, name: "validate_params.#{schema.name}" ]
  end
end

class ApplicationSchema < Dry::Validation::Schema
  configure do |config|
    config.messages_file = './config/dry_messages.yml'
    config.type_specs = true
  end

  def self.schema
    Dry::Validation.Form(self)
  end

  def self.call(params)
    self.schema.call(params)
  end
end

class EmailAddress
  class Schema
    class Create < ApplicationSchema
      define! do
        required(:email_address, Types::Email).value(:str?)
        optional(:email_label, Types::String).maybe(:str?)
        optional(:email_primary, Types::Bool).value(:bool?)
      end
    end
  end
end


class Test < Trailblazer::Operation

  step Macro::ValidateParams(schema: EmailAddress::Schema::Create)
  step :do_everything!

  def do_everything!(options, params:, **)
    p "Successfully validated params! Score!"
  end
end

上面的代码会导致问题。下面,我在EmailAddress::Schema::Create范围内但不在Test范围内引用step Macro的地方,没有任何加载问题:

class Test < Trailblazer::Operation

  step :do_everything!

  def do_everything!(options, params:, **)
    EmailAddress::Person::Schema::Create.(params) # <-- works fine
    p "Successfully validated params! Score!"
  end
end

我不知道为什么step Macro会更改我的应用所需的加载顺序。任何建议都非常感谢!!

0 个答案:

没有答案