【问题标题】:Rails 5 - Namespacing modelsRails 5 - 命名空间模型
【发布时间】:2017-03-21 13:21:23
【问题描述】:

我在我的 Rails 5 应用程序中使用命名空间来尝试保持资源井井有条。

我一直在使用命令行通过将命名空间文件夹添加到生成命令来生成资源。

这会在模型文件夹中为保存命名空间文件的主文件夹创建一个文件夹。

从那以后,我一直在阅读其他人的帖子,这些帖子暗示命名空间模型不是一个好主意。

我目前拥有的一个例子是:

class Stance::Assessment < ApplicationRecord

目前看来一切正常。

命名空间模型有什么问题?

如果这是一个问题,这是否意味着我无法将我的模型组织到文件夹组中,或者是否意味着模型类不需要使用“Stance::”来命名?

【问题讨论】:

  • 你能链接那些抨击命名空间模型的帖子吗?如果您遵循惯例,我找不到令人信服的论据来反对它。将文件分组到名为stance 的文件夹中,在类前面加上Stance 或使用模块(我更喜欢)。

标签: ruby-on-rails namespaces


【解决方案1】:

为模型“命名空间”涉及一定的复杂性成本。 Ruby 实际上并没有真正的命名空间。相反,它具有提供封装的模块。

Rails 和 ActiveRecord 旨在将您的应用程序代码放置在 Main 对象(全局对象)中。虽然这似乎是一种不好的做法,但它非常简单,并且适用于约定优于配置的方法。它还允许更简单的自动加载方案,并避免将每个文件嵌套在其他文件夹中。

命名空间确实有很大的组织优点,可以让你避免冲突。但是后背有一些轻微的疼痛:

  • 表前缀,生成的表名如my_app_projects_tasks 在您需要编写自定义连接时确实很不方便。
  • 您需要覆盖ActiveModel::Naming,这样它就不会在使用多态路由助手时寻找my_app_projects_tasks_path 之类的路径。
  • 您需要在创建关联时显式设置 class_name 选项或覆盖 ActiveRecord 解析常量名称的方式。

【讨论】:

【解决方案2】:

您可以为您的模型添加前缀,因此您可以使用StanceAssessment 而不是Stance::Assessment。不像命名空间那么干净,但它非常接近它

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 2011-05-23
    • 2017-03-25
    • 1970-01-01
    • 2012-07-08
    • 2012-04-18
    • 1970-01-01
    • 2013-05-28
    • 2014-01-29
    相关资源
    最近更新 更多