Rails中的辅助方法

12

我刚开始学习Rails,还有很多东西需要学,所以我可能会经常在Stackoverflow上询问初学者的Rails/Ruby问题。

我现在正在尝试弄清楚Rails中的Helpers是如何工作的。从目前为止我所见到的,Helpers是用于视图(View)而不是控制器(Controller)。

然而,我想编写一个简单的函数来验证params中给定的用户输入(检查某些参数是否定义,并可选地检查其值是否有效)。

有人能向我解释一下实现这个功能的最佳方法吗?(请记住,我希望在许多不同的控制器中使用它,因此应该在全局范围内可用。)

我还注意到,默认情况下Rails不会在主应用程序文件夹中生成lib文件夹。开发者是将他们的库放在app文件夹之外的主文件夹中,还是Rails有不同的库使用方式?

2个回答

20

关于您的验证问题,取决于您要验证什么。

如果数据组成了问题域中的对象,也称为模型,则应使用ActiveModel中内置的验证器。这可能是您应该做的,但不知道具体问题是什么很难说。请参阅Rails指南上的验证章节。通过问自己是否需要在获取数据后存储需要验证的数据来判断是否为此情况。如果是这样,它肯定是一个模型。这种数据的示例是从浏览器表单向Rails发送的博客文章的标题和文本字段。

如果数据对于您的模型来说是第三方的,或者特定于演示,则可以使用helpers。你可能已经注意到helpers主要用于视图,虽然这是正确的,但并没有阻止你在控制器中使用他们,只需使用ActiveController#helper方法声明即可。在ApplicationController类中,许多开发人员会放置helper:all以包含所有控制器中的所有helpers。一旦代码被加载一次,它不会产生太大的性能影响。

请注意,几乎所有传入的数据都可以使用模型进行建模。 Rails世界中的一个重要思想是“Fat Model”。人们认为尽可能将代码放在模型中,并尽可能少地放在控制器中,可以正确分离关注点并导致更易于维护的代码。这表明即使您认为传入的数据无法建模(即您可以创建一个代表它的模型),您也应该尝试将其制作为模型并封装围绕验证它的逻辑。但是,您可能会发现创建helper函数更快,两者都可以工作。

你提到的验证用户输入的想法很好。我感觉你可能是因为刚接触Rails而习惯于自己处理这些事情,但在这里并不适用。在Rails世界中,许多常见的东西如验证都由框架处理。你不需要检查params数组是否存在,而是在模型上调用validates_presence_of方法,并让Rails将错误输出给用户。如果你让框架做它设计用来做的事情,长期来看会使事情变得更容易。

至于你关于lib文件夹的问题,其实并不重要。你可以将杂项支持文件和库放在根目录下的lib文件夹中,然后在应用程序(app文件夹中的文件)中使用它们。你也可以选择将代码抽象成插件或gem包并以这种方式包含它们,许多人都选择这样做。我的建议是,在深入研究gem和插件的概念之前,请先阅读相关资料。


谢谢hornais,非常有用的解释!你说得对,我习惯了自己做很多这样的事情,而不是让框架来处理常见的东西。Rails为你做这件事情是有道理的,我只需要适应一下。我会尝试在模型层面验证输入。 - Naatan

1
你想要的可能是一个自定义验证器(Rails3中的):

http://railscasts.com/episodes/211-validations-in-rails-3

您可以在创建的lib文件夹中添加库,也可以将其添加到config/initializers中的一个文件中。位于initializers目录中的文件将被Rails自动加载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接