首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于声明命名空间类的Rails6约定?zeitwerk自动加载器

用于声明命名空间类的Rails6约定?zeitwerk自动加载器
EN

Stack Overflow用户
提问于 2019-06-20 05:06:26
回答 1查看 605关注 0票数 0

我很好奇在使用zeitwerk进行自动加载的Rails6中,首选的命名空间代码应该是什么样子。

之前我使用的是:

代码语言:javascript
复制
# app/controllers/api/users_controller.rb
module Api
  class UsersController
    def index
      render json: {}
    end
  end 
end

对于zeitwerk,我们现在应该使用:?

代码语言:javascript
复制
# 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错误,并且有一些细微的行为差异:

代码语言:javascript
复制
module Foo
  class Bar
    def fud
    end
  end
end

module Foo
  class Woo
    def woo_woo
      Bar.new.fud
    end
  end
end
代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-07-03 07:07:46

我认为Zeitwerk本身并不关心这两种方式。归根结底,控制器/api/usersControler.rb仍然定义了Api::UsersController,并且Zeitwerk能够在任何一种情况下找到它。

作为一般规则,

代码语言:javascript
复制
module Api
  class UsersController
  end 
end

是首选的样式,所以您可能应该坚持使用它。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56675838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档