Соглашение Rails 6 для объявления классов пространства имен? автозагрузчик Zeitwerk
Любопытно, как должен выглядеть предпочтительный код пространства имен в rails 6, который использует zeitwerk для автозагрузки.
Ранее я использовал:
# 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
1 ответ
Я не думаю, что сама Zeitwerk заботится об этом в любом случае. В конце концов, controllers / api / users_controller.rb все еще определяет Api::UsersController
и Zeitwerk может найти его в любом случае.
Как общее правило,
module Api
class UsersController
end
end
это предпочтительный стиль, поэтому вы должны придерживаться этого.