Соглашение 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

это предпочтительный стиль, поэтому вы должны придерживаться этого.

См. https://github.com/fxn/zeitwerk/issues/57

Другие вопросы по тегам