2011-11-16 57 views
3

我已经被告知,助手只是为视图所需的函数。我应该在哪里放置模型访问的函数? - Rails 3.1

我应该在哪里放置模型常用的函数?关于控制器呢?

什么是放置常用功能的惯例,将用于:

1)模型

2)意见

3)控制器

问题:创建模块在lib中保存这些函数并将该模块包含在一个类中将为该类创建实例方法的船载。

问题:那三种常见和需要的功能呢?

+0

你可以给出一个需要的函数的例子在所有三个? – nathanvda

+0

extract_domain_name(url) - 逻辑模型和控制器都可能使用它。 – user1049097

+0

Stemming是另一个 – user1049097

回答

4
  • 的控制器 - 投入application_controller.rb
  • 用于查看常用的方法 - 把常用的方法在application_helper.rb
  • 的模型 - 猴补丁ActiveRecord::Base包括常用的方法或写通用模型方法的模块,它包括在需要它的模型或者用OOP的方式实现它,方法是用抽象类继承ActiveRecord :: Base,然后继承这个类的所有模型。

要使用常用的方法在这两个模型和控制器,请执行下列操作之一:

  • 写一个普通的Ruby类,把它放在/ lib或其他地方,只要确保它的加载,然后require当你需要使用它的方法时。
  • 将通用功能提取到一个gem,安装它,需要它时需要它。如果它是有价值的,将它发布到rubygems。
+0

谢谢。对于在模型和控制器中使用的功能,您会推荐什么? – user1049097

+0

@ user1049097我已经更新了包含此信息的答案。 – buru

1

...通常情况下,我把这些样的功能为普通超:对于模型,这可能是(例如)动物的子类犬,猫,等。在动物模型,你就必须

self.abstract_class = true 

所以它不指望该类的表。对于控制器,您可以使用ApplicationController,也可以让您的控制器由另一个公共子类派生。

2

Model,你应该保存所有具有类似属性的操作,范围,关联,关系到模型本身的方法...

View你不存储任何的逻辑!逻辑属于模型。在视图中,您只能放置可帮助您显示内容的代码。

Controller是两者之间的“桥梁”。您在控制器中选择数据,调用存储在模型中的方法,...常见的失败是将逻辑存储在应存储在模型中的控制器中。

将方法存储在您的Model中时,您可以从模型,视图和控制器访问它!如果您有一种方法与某个特定型号或几种型号所需的型号无关,则可以使用Helper。这种情况的例子可能是一种使用模式重写URL的方法。这可能需要20个模型来为to_param准备一个字符串。该方法将被存储在Helper中,该模型可以包含在它需要的模型中。

5

问题:创建在LIB一个模块,以承载功能和包括在一个类中的模块将创建的实例方法的类船负荷。

首先组织,然后优化

问题:那么,那些是常见的,在所有三个所需的功能? 你真的有这三种方法都需要的方法吗? 如果是的话,可能是你可以举一个例子

我认为这个问题应该是在哪里把逻辑放在一般。 您应该先考虑一下您的方法在考虑放置位置之前所做的工作。但是无论你创建了什么,当它变得越来越大或者有价值时,你应该真的考虑将它作为gem/plugin导出。

内导航逻辑(什么来显示,并且其中一个动作后去):控制器

  • 应用导航逻辑; application_controller
  • 子集的应用逻辑;创建具有主控制器,类API_controller < application_controller一个命名空间

数据逻辑(如何操纵,处理数据):模型

  • 数据;模型类方法(搜索,排序,计数,宏过程...)
  • 数据;模型实例方法(修改,微处理...)

数据表现逻辑(如何显示数据):助手,局部和装饰

  • 助手并非设计用于在我看来。
  • 部分句柄布局特定数据。
  • 应用装饰器;处理通用数据表示帮助
  • scope_decoration;您可以使用继承

布局语言逻辑(布局语言帮助):帮助

  • 具体到你的应用程序; application_helper
  • 具体到模型...; model_helper,但你应该考虑装饰者
  • Generic;导出的宝石(超级形态帮手,模板系统...)

布局逻辑(我应该显示这个菜单?):

  • 助手/装饰/模型可以应回答这个问题:?@ user.can_edit(@文章)
  • 布局处理显示<%=渲染:局部=>允许? “something”:“别的东西”%>

我想如果你不是在这个配置中,你正在创建一种后端系统。 所以它应该在lib中,然后在gem中。

这个组织只是一个例子。最重要的是组织你的代码并分割不同的逻辑层,并且毫不犹豫地重构/导出代码,以便在添加新功能后使其具有通用性......

相关问题