我遇到了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
会更改我的应用所需的加载顺序。任何建议都非常感谢!!