Rails 3查看重构:条件和查找

时间:2011-07-10 06:36:43

标签: ruby-on-rails ruby-on-rails-3 refactoring find conditional

您认为什么是重构这两位视图代码的最佳方法?

<%if Supplydetail.find_all_by_isbn_id(@isbn).first.nil? %>
<%else%>
<%if Productavailability.find_by_code(Supplydetail.find_all_by_isbn_id(@isbn).first.productsupply_supplydetail_productavailability).nil? %>
<%else%>
<li><%= Productavailability.find_by_code(Supplydetail.find_all_by_isbn_id(@isbn).first.productsupply_supplydetail_productavailability).value %></li>
<%end%>
<%end%>

和(使用formtastic)

%li.tip 
  = tooltip(:test, :hover)
= f.input :relatedmaterial_relatedproduct_idvalue, :label => "Related ISBN", :as => :select, :collection => Isbn.all, :label_method => :descriptivedetail_titledetail_titleelement_titlewithoutprefix, :value_method => :productidentifier_idvalue  
%li.list
  = link_to "Edit list", isbns_path 

我在我的应用程序中有大约几十亿次的例子,并且我想知道在我深入研究这个相当庞大的工作之前,我是以最好的方式进行重构。

1 个答案:

答案 0 :(得分:4)

首先,if / else中的空if分支通常(但不总是!)闻起来不好,所以不要这样做,只会让你的代码更难阅读和理解。

此外,您只需计算Supplydetail.find_all_by_isbn_id(@isbn)Productavailability.find_by_code(...)两次,即可获得<li>输出。不要这样做。

您可能希望将大部分逻辑推入控制器(或者可能是帮助器,具体取决于使用的位置和频率)以减少ERB噪声。

也许这样的事情可以为你(以及任何能够维护你的代码的人)提供更好的服务;首先是一些控制器:

@avail  = nil
by_isbn = Supplydetail.find_all_by_isbn_id(@isbn).first
if by_isbn
    @avail = Productavailability.find_by_code(by_isbn.productsupply_supplydetail_productavailability)
end

然后在你的再培训局:

<% if @avail %>
    <li><%= @avail.value %></li> 
<% end %>

如果您正在做很多这类事情,那么您可以在模型中添加Productavailability.for_isbn便利类方法。然后你的控制器只需要:

@avail = Productavailability.for_isbn(@isbn)

但是在你开始重复之前我不会担心。

我不熟悉formtastic所以我无法帮助你。