如何在Rails中组织不同类型的帮助程序代码?或者,更一般地说,我应该在特定模型/视图/控制器的主文件之外只有视图助手吗?
这就是我的意思:我加入了一个研究大型Rails应用程序的团队。据我所知,app/helpers
中的所有文件都是视图助手,可以通过add_template_helper(HelperName)
或helper :helper_name
包含在控制器和邮件程序中。
但想象一下这种情况 - 你想把一个大邮件分成几个小邮件。在大型邮件程序中,您已定义了几种辅助方法。现在,您还想在新的邮件程序中访问这些帮助程序方法。
你怎么去的?
您是否应该创建一个新的模块/文件,将其放在app/helpers
下,然后通过include HelperName
使用它,还是有其他约定?
我还没有发现这一点,但我想可能还有一些模型助手,我希望在几个模型之间共享,所以我想知道如何组织它们。
编辑:经过一番阅读后,我意识到只是在控制器或邮件程序中包含一个方法会引入此方法成为控制器/邮件程序操作的问题。所以我想这也是一个更普遍的Ruby问题 - 如何在几个类之间共享方法,同时保持这些方法的私有性。如果类A,B和C必须有方法foo,我是否在A,B和C的类定义中将其声明为三次私有方法,或者我可以在模块中定义它,包括类A中的模块, B和C,但是又把它保密了吗?
答案 0 :(得分:2)
是的,您可以在模块中将方法设为私有,将模块包含在多个类中并在其中使用它。在Ruby中private
意味着只能在没有接收器的情况下调用该方法。模块中的私有方法可以由它所包含的类中的实例方法调用,也可以由同一模块中的方法或同一类中的其他模块调用。
因此,模块是分解大型类并在Rails和Ruby中共享代码的好方法。
关于Rails代码组织,
"辅助"具体指的是包含视图中使用的方法的模块。帮助者住在app / helpers中。
Rails 4有"关注",它们存在于应用/控制器/关注点和应用/模型/关注点中。关注点只是一个模块,意在包含在控制器或模型中,扩展ActiveSupport::Concern
(处理模块设置中的一些常见模式)。
如果出于某种原因,您需要一个不是帮助或关注的共享模块或类,只需将它放在与使用它的类/模块相同的目录中,然后根据需要使用它。 / p>
如果您有一整类类别/模块不适合现有的Rails目录结构(例如报表,用例控制器或外部服务的外观),您可以创建一个新目录在app下,将其添加到application.rb中的config.autoload_paths
,并将新的类/模块系列放在那里。