【问题标题】:What types of folders can be there in app folder in Rails app except for models, views, controllers and assets?除了模型、视图、控制器和资产之外,Rails 应用程序的应用程序文件夹中可以有哪些类型的文件夹?
【发布时间】:2017-05-29 15:37:53
【问题描述】:

在一个普通的 Rails 应用程序中,在 app 文件夹下,我们有:资产、模型、视图、控制器等。应该为最佳实践创建哪些其他文件夹?

我在地方和项目中阅读,它们创建工作、序列化程序、服务、验证器、通道。那里有什么?另外,lib目录下的代码是什么样的?

【问题讨论】:

  • 我不明白什么是奉献。我的问题错了吗?你能自己回答这个问题吗?
  • 主要基于意见 许多好的问题会根据专家的经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定的专业知识。
  • 我觉得没问题。有同样疑问的人可以阅读本文并听取经验丰富的开发人员的意见,并为他们做最好的事情。以话语为例。做出贡献的开发人员将对此有经验丰富的意见,并且了解这一点是件好事。我不会接受答案,因为没有答案,但这是一个健康的讨论。欢迎您根据您的经验分享您的意见。这将帮助任何新人或在 Rails 社区有一段时间的人。
  • 我认为这被否决了,因为 (a) 它太宽泛了,(b) 似乎没有研究过,(c) 要求“详细和准确的例子”是一种期望读者会为你做你的研究。我投反对票主要是因为最后一个原因。所以,总是表现出努力 - 我们每天收到数百个懒惰的问题,所以如果你的问题不是其中之一,请确保你区分它。
  • 我不使用 Rails,但这看起来是一个非常有用和彻底的答案。不过,不要将其作为问题与主题相关的证据 - 我们仍然希望问题具体且可回答。

标签: ruby-on-rails


【解决方案1】:

我想根据经验和研究在这里发布答案。请注意,这些不是惯例或必须做的事情。我一直以这种方式使用它们(其中一些)。由于每个人的详细解释都需要针对每个人提出不同的问题。我会在这里参考链接:

序列化器:我用它来序列化数据。在 Rails 中,当将数据呈现为 JSON 时,我们有这个漂亮的 Active Model Serializer 图书馆。

Jobs:我用它来实现工作。可以使用不同的队列后端(如SidekiqResqueDelayed Jobs)对作业进行排队和执行。 Active Job Basics 是一个很好的文档。

Mailers:我用它来实现邮件程序,即我的应用程序的邮件结构。这是Action Mailer Basics的官方文档。

Channels:我将它用于 websockets 的实时功能。我们可以使用动作电缆库来实现实时功能,如帖子、聊天。 Action Cable 已添加到 Rails 核心中,可用作 Faye 等 gem 的替代品。

规则:我在需要规则引擎实现的应用程序中使用它。以下是在 ruby​​ 中提供规则引擎的某些 gem:WongiRulebyRules EngineRools

Services:这些可用于在应用程序内部执行复杂的操作。在模块化的 Rails 应用程序中,我们可以通过查看服务文件夹来告诉应用程序的核心。它们提供解耦、可见性、清洁控制器/模型、随处可访问且易于测试。当操作复杂或跨多个模型或与外部服务交互时,可以使用它们。如果服务变得复杂,我们可以将其分解为其他服务。例如:GenerateReport、PublishWeekly、PayInvoice、RegisterUserWithGoogle。以下是阅读内容:Blog1Blog2Blog3Blog4

查询:数据库查询可以到这里。这些可以在整个应用程序的不同位置使用,同时隐藏查询逻辑。它也适用于单元测试。

Forms:这些处理应用程序中的表单。它们主要用于从 Rails 模型中提取验证。它只不过是一个包含ActiveModel::Model 的简单Ruby 类。我们可以使用reform gem 来实现这一点。以下是更多详细信息:ActiveModel Form Objects

装饰器:这些可用于替换助手。见Draper gem

验证器:自定义验证器可以放在这里,即模型的不同属性,比如用户中的电子邮件。这是一个例子Custom Validators

响应者:这是我们发送回服务器以响应请求的内容。阅读更多:Responders。还有responder gem,其中包括一组响应者模块来干涸。许多程序员也把它放在 lib/responders 下而不是 app/responders 下。

关注点:它们用于提取常见和/或特定于上下文的代码块,以清理模型并避免它们变得过于臃肿和混乱。见这里:ActiveSupport::Concern

上传器:它们用于存储与某些 gem 相关的文件上传器配置:Shrine

请注意,这不一定是惯例。结构完全取决于您和您的 Rails 应用程序。一些项目可能包含更多子目录,如政策、支持、行动等,以获得更多 DRYness 和SRP(单一责任原则)。

参考:

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

https://www.toptal.com/ruby-on-rails/decoupling-rails-components

有关库,请参阅以下链接:

https://devblast.com/b/rails-app-vs-lib

https://gist.github.com/maxim/6503591

http://blog.codeclimate.com/blog/2012/02/07/what-code-goes-in-the-lib-directory/

这是基于我的经验、研究、知识和观点,而不是任何官方指南所遵循的事实或惯例。

【讨论】:

  • 我认为这个答案很好地说明了根据对您有意义的方式组织应用程序。约定只能带您到此为止,事实上,如果您以后改变主意,重新组织它是一个容易的重构。
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2019-05-10
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
相关资源
最近更新 更多