好奇使用zeitwerk自动加载的rails 6中首选的命名空间代码应该是什么样子。
以前我用过:
# app/controllers/api/users_controller.rb
module Api
class UsersController
def index
render json: {}
end
end
end
我们现在应该使用zeitwerk:???
# app/controllers/api/users_controller.rb
class Api::UsersController
def index
render json: {}
end
end
根据https://weblog.rubyonrails.org/2019/2/22/zeitwerk-integration-in-rails-6-beta-2/中的示例,似乎正在使用第二种样式。
默认情况下,rubocop将使用第二种样式引发Style/ClassAndModuleChildren
错误,并且行为上会有细微的差异:
module Foo
class Bar
def fud
end
end
end
module Foo
class Woo
def woo_woo
Bar.new.fud
end
end
end
class Foo::Bar
def fud
end
end
class Foo::Woo
def woo_woo
# NameError: uninitialized constant Foo::Woo::Bar
Bar.new.fud
# no error
Foo::Bar.new.fud
end
end
答案 0 :(得分:1)
我认为Zeitwerk本身都不关心这两种方式。最终,controllers / api / users_controller.rb仍定义Api::UsersController
,无论哪种情况Zeitwerk都能找到它。
作为一般规则,
module Api
class UsersController
end
end
是首选样式,因此您可能应该坚持使用。