您认为什么是重构这两位视图代码的最佳方法?
<%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
我在我的应用程序中有大约几十亿次的例子,并且我想知道在我深入研究这个相当庞大的工作之前,我是以最好的方式进行重构。
答案 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所以我无法帮助你。