【问题标题】:Files at a custom dir in app/ not reloading in dev environment on Rails 5.1应用程序中自定义目录中的文件/不在 Rails 5.1 的开发环境中重新加载
【发布时间】:2018-08-06 12:17:55
【问题描述】:

我在我的项目中创建了一个新的目录和子目录,就像下面的例子:

app/
--- services/
------ comments/
--------- create_comments_service.rb

但是对于我在“create_cmets_service.rb”中所做的每一次修改,我都必须重新启动我的服务器(在开发环境中)。

有什么办法可以避免每次修改此目录/子目录中的文件时都重新启动服务器?


我必须在config/application.rb 中添加以下行,以便 Rails 可以识别我的自定义目录中的文件:

Dir[Rails.root.join('app/services/**/*.rb')].each{|rb| require rb}

【问题讨论】:

  • 你到底想做什么?看起来你在功能上与 Rails 作斗争,你可能会在 Rails 约定中做你需要做的事情。
  • 我想将我的数据库操作存储在该文件夹中。
  • 你会在这些文件中做什么,而你的控制器和/或模型无法做到这一点?
  • 我想从控制器中删除数据库逻辑。保持整洁。

标签: ruby-on-rails configuration


【解决方案1】:

根据您的 cmets,您正在与 Rails 约定作斗争,这几乎总是会受到惩罚。

如果您想保持控制器整洁,而不是用冗长的代码弄乱它们,您应该将该代码放入您的帮助程序方法中。

每当您生成控制器时,它也会生成一个帮助文件。例如rails g controller static 将创建app/helpers/static_helper.rb 将您多余的代码放在这里,并在您的控制器include StaticHelper 中,您将拥有来自您的助手的所有这些功能,可在您的控制器中使用,使其保持整洁。

【讨论】:

  • 感谢您的回复。我想知道您给出的建议是否是处理数据库操作时的最佳实践。我让每个数据库操作成为一个服务类(比如创建、删除......)
  • 据我了解,当直接处理数据库操作时,例如Comment.newComment.create,这应该在控制器和/或助手中完成。服务类通常应该为更复杂的 ruby​​ 保留。
【解决方案2】:

对不起,我没有足够的积分来发表评论,所以我会添加一个答案。

在 Rails 5 中,app 中的所有文件夹都会自动加载。您可以检查所需的子文件夹是否在列表中:

bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'

如果您在输出中看到services/comments,那么您可能需要停止您的rails 服务器,运行spring stop 并在它之后重新启动服务器。 如果您没有看到 - 尝试将 config/application.rb 中添加的行更改为

config.autoload_paths += Dir[Rails.root.join('app', 'services', '**/')]

还有一些关于助手的说法。我不同意 Martin 的观点——助手更常用于移出与视图相关的代码。 但他是对的,为每个控制器动作制作单独的服务并不是一种常见的做法。您的create_comments_service.rb 中有什么内容?

【讨论】:

  • 你好,@Vasilisa!这么晚才回复很抱歉!我很欣赏你的评论。这很有帮助! :D。我创建此文件夹的主要原因是放置与数据库操作相关的操作(作为类)。我实际上不知道这是否是一个好的模式。您还有其他建议吗?再次感谢您:D
  • 很高兴为您提供帮助,@AugustoCarmo :) 这是处理复杂事物的好模式。例如,CommentsController#create:为文章创建评论,向文章所有者发送电子邮件,创建一些通知并为您制作披萨。在这种情况下,将所有这些复杂的逻辑转移到服务中是个好主意。如果我能看到你的控制器/服务代码会更容易提供帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2017-05-23
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多