Rails [新手] Rails 如何在 model 中访问到 controller 中的方法

jsoner · 2015年12月24日 · 最后由 jsoner 回复于 2015年12月25日 · 4353 次阅读

本人是一名刚做前端不久的菜鸟,入职公司不久,因为工作需要被安排做 rails 开发。由于之前完全没接触过,所以一直是摸着石头过河,学习进度很慢。 现在做一个功能时,需要在 model 中调用一个 controller 中的方法,各种试都不行。 按网上的各种教程说法,rails 应该是先通过 controller,再走 model,不知道我这样做可不可以?

求问各位朋友应该怎么实现?还是我这种做法本身就是错的?

PS:由于论坛用的是谷歌搜索,所以没办法使用搜索功能,也不知道之前是否有人问过类似问题,如果有朋友知道,也可以给个链接我参考一下,不盛感激。

本身就是错的。

建议还是先理解一下 MVC

在 models 里面定义方法,在 controller 里面的 action 方法调用 model 里面的方法吧,MVC 各部分分工明确。我也是新手,希望相互学习。

单就“如何在 model 中访问到 controller 中的方法”问题来说,这个做法是错的。如果能描述目标而不是过程就可以提供一些建议。

#4 楼 @rei 您是论坛第一个 user,我想问您一下为什么我无法修改头像,上传以后总是修改不成功。

#2 楼 @easonlovewan 你们这种回答对提问者没有多大帮助只有打击,虽然提问需要艺术,但是社区里面每一个人都应该是积极的参与,要么就不要参与进来。

楼主多想了,本人没有其它想法,纯粹的建议!!!我想我们任何一个人的解决方案也比不上你去认认真真读一遍文档印象来的深,不然我会认为你是"伸手党",这是一种习惯并且对你以后的发展会有很大的影响。管理员也不希望出现那些明明文档里边儿写的黑纸白字的东西,非要拿到社区里边儿问一通。再次强调一下没有其它想法@rei

#4 楼 @rei 谢谢!首先,我本身之前是完全不知道 rails 这个东西的,也没有接触过 ruby。我是一个纯前端,而且入行不久,这是背景。 具体情况是这样: 需求:做一个类似专题页的产品展示,要求这个专题页面可以在 cms 后台中实现可视化编辑,同时要求产品信息可以实现每周自动更新,并生成静态页。 可视化编辑在现有 cms 后台中是已经有这个功能的,但现有可能中的可视化中,产品是需要手动编辑导入的,没有自动更新功能。 由于没有相关经验,完全自己再写一个可视化编辑显然不现实,所以我是照着之前的源码自己一点点百度加问同事模仿出来的。 在这期间于是碰到了我上面说到的问题,会有这个问题的原因是生成静态页这个功能原有的可视化代码是直接写在 controller 中的,我看过一些 API 和 rails 的教程文章,大概知道 controller 中不应该放业务逻辑代码,但现有的这么写,我心里不免就会想是不是这样也可以?所以才发帖询问。

表达能力不是很好,不知道有没把情况说清楚。

PS:问题后来的解决方法是我把现有的代码 copy 了一份到我自己的 model 中。

#7 楼 @easonlovewan 您说得很有道理,我对您的观点也表示同意。 也许您是一位自学能力很强的人,对于一个新的知识点能很快上手并且知道怎么查找 API,但很遗憾我做不到这一点,我试过查看 API,但不知道我应该看哪一页的哪个方法,我也尝试搜索论坛,但由于国内对谷歌的限制搜索功能似乎无法使用。 我不是为自己辩解什么,我只是想说:API 的确是个好东西,但也不是能帮助每个阶段的读者。比如一个完全不知道 java 是什么的人,你给他一份 JAVA 的 API,即便再详细,我想他也很难在短期内看懂,而工作不可能允许你花太多时间去研究。

#2 楼 @easonlovewan 我猜你想说的是我想在 controller 中完成 model 应该做的事情,这本身是一个错误的做法?

#5 楼 @dorbod 好像你说得不是很清楚,你是指上传头像之后右边头像的图片没有变化么? 上传新头像右边似乎是不会第一时间更新的,应该是后台需要一段时间来处理图片的尺寸等问题。 上传完头像,点击更新资料后,稍等一段时间再刷新看看应该就变过来了。

#3 楼 @dorbod 嗯嗯,我是这么做的,不过 MVC 还在努力理解之中,共同加勉!

PS:问题后来的解决方法是我把现有的代码 copy 了一份到我自己的 model 中。

我觉得这就是正确的做法了,操作 model 的方法就放在 model 里,操作多个 model 的方法就写个模块去 include。

#10 楼 @jsoner model 和 controller 本身都是类,类与类之间的方法当然可以相互调用了,只是没有人这么干的!https://ihower.tw/rails4/basic.html

controller 的公开方法一般是被路由调用的,所以不会也不应该被 model 调用。controller 接收 router 的指派去处理请求(URL),创建相应的实例对象,然后渲染相应的页面(erb 文件),在 erb 里可以访问到那些实例对象。

我是一名非 IT 类从业人员,完全自学 Rails~ 所以耐心看看 Rails Guide,起码走一遍 tutorial,会有别样感受。

另外再次强调 Rails 是强约定框架,如果你不按照 Rails 的套路做,会非常痛苦。

#15 楼 @dongli1985 嗯,目前正在看 tutorial。

#14 楼 @easonlovewan 多谢您的分享!

18 楼 已删除

#13 楼 @dudu_zzzz 嗯,我知道是应该放在 model 里,只是现有代码写在了 controller 中,我目前还不清楚哪些地方引用到了这段代码,所以没办法移动位置,也可能有很方便的处理方法,只是我还不知道。之所以问这问题,是因为感觉复制一份一样的代码,违背了 rails 的不重复原则,后来是没有找到更好的解决办法,就先将就着解决了。

需求:做一个类似专题页的产品展示,要求这个专题页面可以在 cms 后台中实现可视化编辑,同时要求产品信息可以实现每周自动更新,并生成静态页。 可视化编辑在现有 cms 后台中是已经有这个功能的,但现有可能中的可视化中,产品是需要手动编辑导入的,没有自动更新功能。

没看明白,需求是要做能自动更新的可视化编辑?想象不出来是什么。

如果是我的话,我应该会把现有的 controller 里的方法抽到 model 里,然后在 controoler 里调用这个方法,你要写的这个 model 也调用刚抽出来的那个 model 里的方法,这样做也不会影响其它的。

#21 楼 @tianlitao 嗯嗯,明白你的意思,但是毕竟是公司的正式项目,暂时不太敢随意改动,等再熟练一些再尝试吧。

#20 楼 @rei 好吧,是我没表达清楚,就是页面中有些内容是需要经常编辑的。 页面是由其他部门来维护的,他们只有编辑人员,不太懂技术,而页面上有些像背景图片,轮播图之类的是要经常更换的,所以需要做成可视化编辑的模式,方便他们能实时看到效果。我们现有的可视化编辑功能中产品展示模块是需要编辑自己手动添加商品的,他们嫌麻烦,要求做成自动获取不同分类的各自最热销售商品。

前端转 Rails 困难不困难?

#24 楼 @winnie 我个人感觉还好吧,除了 MVC 是个短板,得慢慢理解,其它都还 OK。

前面回复太多,没看哈,可能和别人说的重复了。

个人建议:model 只做数据库操作相关,属性校验,写 callback 等即可,如果出现类似『likes_count +1,并且当 likes_count 大于 10 时,更新 hots = true』这种即包含数据库更新,又包含逻辑计算的代码,就单独写一个类去做,比如 app/query/*.rb 来做一些类似的事情。

这样可以避免出现『model 里调用 controller 方法』的情况。

这样做的好处是:方便测试这个包装类,而不用为了一个测试而去折腾 model 测试。另一个好处是符合 mvc 要求。mvc 不是说你整个项目只能是 mvc 代码,它只是基础代码,在这个基础上增加我们的业务类代码。别被 mvc 束缚。

工作忙,没细想,希望上面的字能帮你开拓思路。

#26 楼 @liwei78 嗯嗯,感谢您的指导!目前 rails 使用还不太熟悉,没办法把逻辑分得那么清楚,我会努力的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号