页面重构,将重构进行到底!

本文探讨了在Rails应用中如何重构视图代码以提高其可读性和可维护性,包括减少if-else语句、合理利用helpers及优雅处理空集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

view中的bad smells:
1 N多的if else,甚至case语句
这是本文的重点,在最后着重讲(用block替代if else)。
2 直接调用model的find方法
对策:将find move到controller中,在view中使用controller传来的对象变量

3 对集合进行复杂的操作
对策:在将这些操作move到helper中,页面调用规整好的数据
[code]
<% items.sort_by{|item|[item.created_on,item.price]}.each do |item| %>
#so bad
<% end %>
[/code]
===>
[code]
<% sorted_item.each do |item| %>
#so good
<% end %>
[/code]
4 临时变量
将临时变量的代码段 move到helper中
[code]
<% rate_box_id = "rate_box_#{item.id}" %>
<% spinner_id = "spinner_#{item.id}" %>
<%= link_to_remote("rate it!",
:url => item_path(item),
:loading => "$('#{spinner_id}').show()",
:complete => "$('#{spinner_id}').hide();$('#{rate_box_id}').highLight();",
) %>
<%= image_tag('loading.gif', :id => spinner_id)%
[/code]
==>
[code]
<% with_rate_for item do|spinner,spinner_id| %>
<% link_to_rate(item,:toggle=>spinner_id) %>
<% spinner %>
<% end %>
[/code]
=========用block替代if else==============
1 如果集合为空,显示友好的信息
很多时候,如果取到的结果集合为空,需要显示用户另外的信息。当然一般我们会这么写:
[code]
if(@cart.empty)
您的购物车是空的
else
rend :parial=>'cart'
end
[/code]
注意,这是在rhtml中写的。这个逻辑还是比较清晰的,但如果一个页面中有几处这种代码,你就得好好考虑一下重构了.
我们可以把集合为空的内容,提到block中,比如:
<%cart_content do%>
购物车是空的!+N长的rhtml代码
<%end%>
将if else都转移到helper中:
[code]module CartHelper
def cart_content(&block)
return yield if cart_empty?
content=(render :partial => "shared/cart" ,:locals => {:cart => prepare_cart})
concat(content,block.binding)
end
end[/code]
2 面对不同的登陆用户,显示不同的内容
[code] <%header :guest do %>
#略
<%end%>
<%header :logged_user do %>
#略
<%end%>
<%header :admin do %>
#略
<%end%>[/code]
helper中的方法
[code] def header(who)
yield if logged_in? who
end[/code]
==========================总结================================
以上代码,都是一些例子,可能不太具有说服力。但在这里要强调的是,view层难测试,自解释差,难重用。在复杂度综合不便的情况下,我更倾向于helper复杂一些,view简单一些。更何况,一些公共的重复代码搬移以后,的确会达到DRY的目的,这是rails设计中是中贯彻的理念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值