----先看这么一段rhtml代码:渲染模板中加入了这么多的逻辑,看起来不伦不类,这么做行是行,但是缺点很多,新手一般有这个毛病。那么这样做,首先是可读性很差,因为在渲染代码中最好都是贴近HTML代码,而这堆代码里把C的内容也加进来了。
再看看controller和model里的东西:
空荡荡的controller,而在model里仅仅有一句关系声明。这么组合成的MVC显得很别扭,似乎就是一层渲染模板。几乎把C与M都忽略了。
无论如何这在MVC框架里是糟糕透顶的现象,MVC经过这么多年的实践考验,它的优点在于“可读性强”“可维护性好”“模块化”“关注点的分离”等等,我想你用MVC框架也就是想实现这些优点哇?那么首先需要改进的是尽可能的将逻辑内容搬到controller中,controller 的作用就是介于view和model之间,起到一个类似中介的作用。下面来看下这样改动之后的代码:
这样看起来就好多了,模板中的代码更像是HTML的结构,而且你粗略的看一下controller里的代码就能知道在这个action渲染的模板中会显示什么数据。
还可以更进一步做的事情就是将现在模板代码中关于一部分数据的处理挪到Model中来:
这样通过在model中添加几个虚拟属性,在view里调用,显得很合理,而且模板代码更简洁明了了。
下一步就是将controller里的代码理一理。因为controller只能算是个中介,不应该参与很多的逻辑处理。
现在看index这个action,扫一眼就知道它要干吗。而且如果find_recent方法在以后需要改变时,可以直接在model里进行修改。
--总结一下,尽量使得controller的actions中的代码和view中的代码更少,在action中要是能只写一行达到效果最好。在view中要尽量使代码贴近html结构。
还有一个不太明显的好处就是,瘦action可以使得 respond_to 结构更突出,可以看出输出的类型是什么。
<% people = Person.find( :conditions => ["added_at > ? and deleted = ?", Time.now.utc, false], :order => "last_name, first_name") %> <% people.reject { |p| p.address.nil? }.each do |person| %> <div id="person-<%= person.new_record? ? "new" : person.id %>"> <span class="name"> <%= person.last_name %>, <%= person.first_name %> </span> <span class="age"> <%= (Date.today - person.birthdate) / 365 %> </span> </div> <% end %>
再看看controller和model里的东西:
# app/controllers/people_controller.rb class PeopleController < ActionController::Base end # app/models/person.rb class Person < ActiveRecord::Base has_one :address end
空荡荡的controller,而在model里仅仅有一句关系声明。这么组合成的MVC显得很别扭,似乎就是一层渲染模板。几乎把C与M都忽略了。
无论如何这在MVC框架里是糟糕透顶的现象,MVC经过这么多年的实践考验,它的优点在于“可读性强”“可维护性好”“模块化”“关注点的分离”等等,我想你用MVC框架也就是想实现这些优点哇?那么首先需要改进的是尽可能的将逻辑内容搬到controller中,controller 的作用就是介于view和model之间,起到一个类似中介的作用。下面来看下这样改动之后的代码:
<!-- app/views/people/index.rhtml --> <% @people.each do |person| %> <div id="person-<%= person.new_record? ? "new" : person.id %>"> <span class="name"> <%= person.last_name %>, <%= person.first_name %> </span> <span class="age"> <%= (Date.today - person.birthdate) / 365 %> </span> </div> <% end %>
# app/controllers/people_controller.rb class PeopleController < ActionController::Base def index @people = Person.find( :conditions => ["added_at > ? and deleted = ?", Time.now.utc, false], :order => "last_name, first_name") @people = @people.reject { |p| p.address.nil? } end end
这样看起来就好多了,模板中的代码更像是HTML的结构,而且你粗略的看一下controller里的代码就能知道在这个action渲染的模板中会显示什么数据。
还可以更进一步做的事情就是将现在模板代码中关于一部分数据的处理挪到Model中来:
# app/models/person.rb class Person < ActiveRecord::Base # ... def name "#{last_name}, #{first_name}" end def age (Date.today - person.birthdate) / 365 end def pseudo_id new_record? ? "new" : id end end
<!-- app/views/people/index.rhtml --> <% @people.each do |person| %> <div id="person-<%= person.pseudo_id %>"> <span class="name"><%= person.name %></span> <span class="age"><%= person.age %></span> </div> <% end %>
这样通过在model中添加几个虚拟属性,在view里调用,显得很合理,而且模板代码更简洁明了了。
下一步就是将controller里的代码理一理。因为controller只能算是个中介,不应该参与很多的逻辑处理。
# app/models/person.rb class Person < ActiveRecord::Base def self.find_recent people = find( :conditions => ["added_at > ? and deleted = ?", Time.now.utc, false], :order => "last_name, first_name") people.reject { |p| p.address.nil? } end # ... end
# app/controllers/people_controller.rb class PeopleController < ActionController::Base def index @people = Person.find_recent end end
现在看index这个action,扫一眼就知道它要干吗。而且如果find_recent方法在以后需要改变时,可以直接在model里进行修改。
--总结一下,尽量使得controller的actions中的代码和view中的代码更少,在action中要是能只写一行达到效果最好。在view中要尽量使代码贴近html结构。
还有一个不太明显的好处就是,瘦action可以使得 respond_to 结构更突出,可以看出输出的类型是什么。
class PeopleController < ActionController::Base def index @people = Person.find_recent respond_to do |format| format.html format.xml { render :xml => @people.to_xml(:root => "people") } format.rss { render :action => "index.rxml" } end end end
发表评论
-
使用 Capistrano 对rails app进行快速部署
2011-02-23 15:05 1767仅转载了,还没有用过,如果有问题可留言,大家一起讨论 在进行 ... -
ruby进行web serveice的方法
2011-02-15 14:37 842require 'soap/wsdlDriver' #url ... -
友好的登录系统
2011-01-28 10:54 679友好的登录系统 按照目前的代码,如果管理员尝试在未登录的状态下 ... -
第三版
2011-01-27 15:36 0view格式化价格 <%= number_to_curr ... -
用户操作数据库记录
2011-01-25 15:16 856今天我们看看怎样在数据库记录用户操作 db/migrate/0 ... -
Ruby中 respond_to? 和 send 的用法
2011-01-25 14:24 1247obj = Object.new if obj ... -
rails 路由
2011-01-25 14:17 11574 正则路由 Rails支持 ... -
rails 验证自定义方法
2011-01-25 11:37 1573可以自定义validate(), 这个方法在每次保存数据时都会 ... -
flash-notice自动消失
2011-01-25 11:12 1374flash 提示的自动消失: <body onloa ... -
密码加密和解密
2011-01-25 11:11 1200two way crypt: #http://crypt. ... -
开发环境页面直接调试
2011-01-25 11:06 672#首先,在layout里边的合适地方添加debug,并且使 ... -
对静态页面进行缓存
2011-01-24 14:35 934对于静态站点我们可以利用Rails的cache来管理,如在co ... -
rvm部署rails3和ruby192
2011-01-21 10:39 10891. Installing RVM $ sudo gem ... -
rails要理解
2011-01-18 10:57 606清单3 module Dictionary ... -
rails 加载不同插件设置
2010-12-31 14:49 384config.plugins = [ :all ] co ... -
参考rails 下拉
2010-12-31 14:47 624对于多数的model的select列表,我都会用model属性 ... -
自定义form提示
2010-12-31 10:53 689自定义form错误提示 application_contro ... -
提高rails开发模式下静态页加载速度
2010-12-31 10:44 876http://github.com/thedarkone/ra ... -
rails 连接多个数据库
2010-12-30 10:31 754首先在database.yml中加入以下代码,其中cg_clo ... -
rake 命令一览
2010-12-28 11:21 991rake db:abort_if_pending_migr ...
相关推荐
MVC实现View—controller—Model分离
Model View Presenter vs Model View Controller
An adaptive sliding mode controller (ASMC) based on characteristic model is designed to overcome the detrimental effect of large inertia ratio and large-range varying inertia in high accuracy servo ...
用界面封装逆向工程(mapper xml dao model),还有简单的server, controller
Maverick是一个轻量而完备的MVC Model 2框架。Maverick的Action称作Controller。Controller只接受一个...这种麻烦自然而然会导致这样的可能用法,直接把Controller本身设置为model,这又回到了Controller和Model一体。
这个是我在工作的时候需要使用的工具,大大减轻了工作量,拿出来共享一下。此为C#开发,所以需要安装.Net版本为2.0或者以上。希望对你有帮助。
Simulink for turbine generating main controller section.
晕倒,本来写好的controller,model,view都被误删了,真是熬夜熬晕了
小项目或功能比较单一的项目可以直接新建一个MVC基本项目类型即可,但随着需求不断迭代,项目的功能模块越来越多,甚至有些模块可以独立开发,这时就要考虑主项目的M/V/C三大部分分离,便于不同角色的工程师专注自己...
假定两个Controller都在同一个工程中。 如果有比较合理的分层设计,这样的需求应该是非常罕见的。因为大部分情况下,调用应该都是限于对业务逻辑层或者数据库层,并不会涉及Controller之间的调用。 本文是讨论...
本篇文章主要介绍了springMVC如何将controller中Model数据传递到jsp页面,具有一定的参考价值,有兴趣的可以了解一下
MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。...
最新写了一个java web代码生成器,主要可以根据模板生成对应的controller、service、model。尤其是在做毕业设计时,很多code都是类似,这样就少去了ctrl+c/v的时间。 其核心是根据反射mysql数据表clum映射到实体中,...
Realtek PCIe GBE Family Controller 驱动
USB Serial Controller 驱动程序
代码生成平台controller/service/dao/mybatis/model
ddr sdram controller IP core writen in verilog. source include ddr sdram controller verilog design files and simulation model etc.
springmvc controller
floodlight controller学习笔记
Nonlinear Flight Controller Design Using Combined Hierarchy-Structured Dynamic Inversion and Constrained Model Predictive Control