【问题标题】:Rails - Grails Service EquivalentRails - Grails 服务等价物
【发布时间】:2011-09-02 16:34:45
【问题描述】:

当你想在 Rails 3 中编写一个内部服务层时,你应该把代码放在哪里?我来自 Grails 背景,想知道 Rails 中的服务等价物是什么。

此外,如果文章或在线视频中包含此内容 - 希望有链接。谢谢。

【问题讨论】:

  • 内部服务层是什么意思?它是模型/控制器之外的特定应用程序逻辑还是其他什么?
  • 示例:您想提供一项服务以通过其 REST API 与远程 ERP 或 HR 系统对话。但是你想集中这项工作的逻辑,而不是让它传播到控制器中。而且您还不确定您正在处理的代码是否上升到插件/gem 的级别。
  • 本来想回答 Jeff 在下面回答的问题,不确定是否是您想要的,但我认为是。通常,特定于您的应用程序的非控制器逻辑存储在lib 文件夹中。记得把东西封装在一个模块中,这样你就不用担心类冲突了。

标签: ruby-on-rails ruby-on-rails-3 grails service-layer


【解决方案1】:

在这种情况下,Rails 约定通常是将这些东西放在 lib 文件夹中(即 lib/services/erp_service.rb)。我在 'app' 目录下创建了一个 'Services' 文件夹来包含过去的类似服务。我不相信你需要做任何额外的事情来加载类,但是如果你想把你的服务放在'app'目录下并且它们似乎没有加载你可以尝试使用config.autoload_paths选项application.rb(在 Rails 3.x 应用程序中)

# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
config.autoload_paths += %W(#{config.root}/lib

【讨论】:

  • 这些 autoload_path 的类在 Rails 控制台模式下是否也可用?
  • 是的,据我所知。我的理解是,在做一个简单的测试后似乎是正确的, /app 下的任何东西都会自动加载。因此,如果您将服务放在 /app/services 下,它们就会在那里。在根目录中添加另一个自动加载目录(例如 /services)应该与 /lib 的行为方式相同。 /lib 中的文件 加载到 rails 控制台。 rails 控制台的加载方式应该与您的应用在运行“rails server”时的加载方式完全相同
  • 该行真的应该是 - config.autoload_paths += %W(#{config.root}/lib/services 吗?还是自动加载路径应该递归到子目录中?我无法理解没有这个就可以工作。
  • 实际上更糟 - 我记得现在我在做 rails 控制台时必须做一个 require 'C:/projects/testproject/lib/services/test_service' 。有没有办法从控制台判断 config.root 指向的位置?
  • 这有助于让我的应用程序正常工作 - stackoverflow.com/questions/4074830/…
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多