【问题标题】:How to organize helper code in Rails?如何在 Rails 中组织帮助代码?
【发布时间】:2014-06-06 16:04:23
【问题描述】:

您如何在 Rails 中组织不同类型的帮助代码?或者,更一般地说,我是否应该只在特定模型/视图/控制器的主文件之外拥有视图助手?

我的意思是:我加入了一个开发大型 Rails 应用程序的团队。据我所知,app/helpers 中的所有文件都是视图助手,可以通过add_template_helper(HelperName)helper :helper_name 包含在控制器和邮件程序中。

但是想象一下这种情况 - 您想将一个大邮件分成几个较小的邮件。在大型邮件程序中,您定义了几个帮助方法。现在您还想在新的邮件程序中访问这些辅助方法。

你是怎么做的?

您是否应该创建一个新模块/文件,将其放在app/helpers 下,然后通过include HelperName 使用它,还是有其他约定?

我还没有偶然发现这一点,但我想可能还有一些模型助手,我想在几个模型之间共享,所以我也想知道如何组织它们。

编辑:经过阅读后,我意识到仅在控制器或邮件程序中包含一个方法会引入此方法成为控制器/邮件程序操作的问题。所以我想这也是一个更普遍的 Ruby 问题——如何在多个类之间共享方法,同时保持这些方法的私有性。如果类 A、B 和 C 必须具有方法 foo,我是在 A、B 和 C 的类定义中将其声明为私有方法 3 次,还是可以在模块中定义它,将模块包含在类 A 中, B 和 C,但又要保密?

【问题讨论】:

标签: ruby-on-rails ruby helpers code-organization view-helpers


【解决方案1】:

是的,您可以在模块中将方法设为私有,将模块包含在多个类中并在其中使用它。在 Ruby 中private 意味着该方法只能在没有接收者的情况下调用。模块中的私有方法可以被它所包含的类中的实例方法调用,也可以被同一模块中的方法或同一类中的其他模块调用。

因此,模块是在 Rails 和 Ruby 中分解大型类和共享代码的好方法。

关于 Rails 代码组织,

  • “helper”特指包含在视图中使用的方法的模块。助手住在 app/helpers 中。

  • Rails 4 有“关注点”,它们存在于 app/controllers/concerns 和 app/models/concerns 中。关注点只是一个模块,旨在包含在控制器或模型中,扩展 ActiveSupport::Concern(处理模块设置中的一些常见模式)。

  • 如果出于某种原因您需要一个不是帮助程序或关注点的共享模块或类,只需将其放在与使用它的类/模块相同的目录中,然后随意使用即可。

  • 如果您有一整类不适合现有 Rails 目录结构的类/模块(例如报告、用例控制器或外部服务的外观),您可以在 app 下创建一个新目录,将其添加到 application.rb 中的config.autoload_paths,并将您的新类/模块系列放在那里。

【讨论】:

  • 不过,有一件事 - 如果我在模块中使用关键字 private 定义私有方法,这些方法将成为包含该模块的类的公共实例方法。所以在控制器的情况下,它们也变成了动作。我想只要没有路由调用这些操作,这不是问题,但这不是一个糟糕的模式吗?
  • 我同意这并不理想,但它从未对我造成任何伤害,因此我从未觉得有必要采取更严格的措施。
猜你喜欢
  • 2016-08-14
  • 2010-09-27
  • 2016-05-08
  • 1970-01-01
  • 2012-07-05
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多