新手问题 关于 Rails 业务逻辑是放在 Model 里面还是 Controller 里面呢?

egg_show · May 16, 2014 · Last by cckkll replied at November 24, 2020 · 9334 hits

我们现在有个 APP 项目,基本上很多的数据库操作的一些逻辑都放在了控制器里面;之前是学 java 的,MVC 模式,也略知一二,是不是应该将业务逻辑和控制器分开呢?其实 java 和 ruby 我都是新手 - -,有木有资深能详解下 rails 项目的架构和目录结构!!!

这是内功 不好详细说 理论上你可以把代码写在任何地方:controller model context service observer decorator lib 甚至 helper 但是具体业务代码怎么划分就需要详细规划了 推荐阅读 gitlab 源码 比较清晰

rails 是充血模型,业务逻辑一般放modelcontroller 只处理请求和跳转。

#3 楼 @saiga 就说数据库查询 User.all.each do ... end 这些个是放在 model 里面,C 就只充当控制器的角色,C 会去调用 model 的业务方法,再将结果返回给 view,是吗?

#4 楼 @egg_show helpers 里面可以写什么代码呢?

#4 楼 @egg_show 看具体情况,数据处理是业务相关还是其他。一般涉及业务不会只有一两行,不建议放到 controller,有时甚至 model。与 view 相关的会放到 helper 或直接写在 view 里

#6 楼 @saiga 数据库操作的话是放在 model 吧,有些地方貌似不能通过 model 访问数据库?

哪里都可以。

有时候还是放到 controller 方便,数据处理经常会涉及多个 model 的联合操作

可以的遵循 restful、mvc、tdd 这些东西,等于自己给自己上枷锁,最后把自己锁的寸步难行。这些模式都是好事,但不能死套模式

#12 楼 @ddyy 锁习惯了就没锁了,当你习惯将业务逻辑放 model 了就好了。。

业务逻辑放 model 一直是 Rails 的传统。

最近一年有反动思潮称 ActiveRecord 应该只负责 persistence, 把业务逻辑放入其他。DHH 反对这个并拿出 GOF 的 ActiveRecord pattern 做论据。

我自己的看法是,简单一点的逻辑就没所谓。但多了的话,由 model 负责太多其实违反了 SRP, 我觉得只管 persitence 会比较清爽。

簡單邏輯放 model 方便。ruby-china 的 User model 都快 400 行了,雖然我覺 400 有些過分。。

跨 Model 的复杂逻辑,我现在都放到 Service 对象中了。

#16 楼 @xiaoronglv Service 对象?求科普

controller 里出现相同逻辑 2 次以上就考虑放在 model 了 还有 controller 里面最好别超过 10 行

#21 楼 @karmue 是的,可以把所有的业务都放在类似 service 下面吗,类似 java 的 action 统一放在 service 下面,感觉更清爽 - -

#17 楼 @shihangw Fat Model 现在也有人认为不妥了哇,参看这篇博文:http://solnic.eu/2011/08/01/making-activerecord-models-thin.html

#24 楼 @beyondyuqifeng Behavior + Persistence 似乎是不错的点子,测试可以避开数据库。

#14 楼 @billy GOF 中可没提 ActiveRecord pattern 。

#25 楼 @chenge 刚看的时后很震惊,因为自己还处在把 controller 中的逻辑迁移到 model 中的状态,技术真是无止境啊

#24 楼 @beyondyuqifeng 这个看你需要,不过我觉得直接用自动产生的测试数据库(比如 fatory girl)来测试更靠谱,多搞一层就是为了绕开数据库没有必要。当然如果 model 太肥,把 model 中的 code 迁移出去是必须的,得具体问题具体分析,就像这篇一样 http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

@skandhas 那就是"Patterns of Enterprise Application Architecture", 记不太清楚了。总之 DHH 是引用了 Martin Flower 的网页:http://www.martinfowler.com/eaaCatalog/activeRecord.html

他的原话我没记录,看过就看过了。大意是让看 UML 里面几个 methods, 这些超出了简单的 persistence

#24 楼 @beyondyuqifeng Don't over-engineer, don't under-engineer. Make it just right for the thing you are building.在理 - -

这文章 网站已经变成 18 禁了

You need to Sign in before reply, if you don't have an account, please Sign up first.