在轨道中将控制器访问的可重用方法放在何处

时间:2010-04-28 05:01:33

标签: ruby-on-rails ruby architecture

我从我的控制器调用了几种方法,感觉它们应该被拔出并放入控制器之外的可重用类中。人们通常把这些东西放在哪里?我知道我可以将它们放入我的ApplicationController中,但如果我认为以后可以在其他应用程序中使用这些方法,这似乎不是一个很好的解决方案。

另外,我的控制器中有很多实用程序方法,可能不会在其他控制器中使用,或者将来根本不会使用,但我觉得它们只是让我的控制器膨胀了一下。人们通常会把它们移到某个地方以保持清洁,还是最终得到一个巨大的控制器?

我来自Java和Actionscript,我只是为这些东西创建新的util类。

5 个答案:

答案 0 :(得分:13)

lib目录是一个可以放置模块/类的地方,这些模块/类可以混合在控制器中或者由控制器使用(实际上是其他任何东西)。这可以是放置不属于其他区域的代码的地方(但要小心确保lib本身不会变成混乱)。旁边的评论只是要记住:

  • 如果您知道有大量可能或将要在其他应用程序中使用的相关功能,则可能是插件。

  • 还值得记住的是,创建一个不是Active Record对象的模型没有任何问题。所以,取决于你拥有的东西,这也可能有意义。

答案 1 :(得分:11)

您可以创建app/modules目录,并在其中创建XYZUtils模块,例如

module XYZUtils
  def abc
  end

  def efg
  end
end

并在控制器或模型等中根据需要包含模块。

include XYZUtils

您可以为与不同模型或实体相关的实用程序功能创建不同的模块

我不喜欢/lib目录,因为它应该包含与项目相关的代码,而不是与应用相关的代码,例如任务等。

我会将所有与App相关的代码保存在/app目录本身

答案 2 :(得分:9)

lib目录中创建模块文件:

module ControllerUtil
  def foo
  end

  def bar
  end
end

将模块包含在控制器中:

class UsersController < ApplicationController
  include ControllerUtil
end

答案 3 :(得分:1)

控制器应该非常小 - 基本上可以摄取参数并做出一些非常高级别的决策。如果你有一些帮助函数正在做这些事情但不会被重用,那么将它们保存在控制器中是正确的。只需确保将它们标记为私有。

对于更常见的共享内容,您可以将它们备份到ApplicationController中(如果它们在所有控制器中使用)或者应用到app / models目录中的类中。我建议使用lib上的models目录,因为开发模式下的Rails更好地发现对这些文件的更改并重新加载它们。对/ lib中文件的更改往往需要重新启动Web服务器,这会减慢您的开发工作量。这很不幸,因为控制器助手实际上不应该与模型混合在一起。

一般来说,如果你有这些助手的数量不止一个,那么你的控制器可能做得太多了。仔细看看它们,看看它们中是否有一些不应该成为你模特的一部分。

答案 4 :(得分:1)

与Sahil kalra相关的2014年以上答案:

Rails现在有一个app/controllers/concerns目录,您可以在其中放置充满辅助方法的模块,并在控制器中轻松包含或扩展它们。我只是从我的application_controller复制并粘贴了所有逻辑密集型方法,它们开箱即用。

(当然,在将任何内容投入生产之前,您仍应确保一切正常。)