声明命名空间类的Rails 6约定? zeitwerk自动装带器

时间:2019-06-19 21:06:26

标签: ruby-on-rails-6

好奇使用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

1 个答案:

答案 0 :(得分:1)

我认为Zeitwerk本身都不关心这两种方式。最终,controllers / api / users_controller.rb仍定义Api::UsersController,无论哪种情况Zeitwerk都能找到它。

作为一般规则,

module Api
  class UsersController
  end 
end

是首选样式,因此您可能应该坚持使用。

请参见https://github.com/fxn/zeitwerk/issues/57