2011-07-10 39 views
0

你會推薦什麼來重構這兩個視圖代碼的最佳方式?Rails 3視圖重構:條件和查找

<%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 

我有其中的每例約在我的應用程序一個bazillion次,想知道我重構以最好的方式我以前潛水在這個相當巨大的工作。

+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 

,然後在ERB:

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

如果你做了很多這樣的事情,那麼你可以在添加Productavailability.for_isbn方便的類方法你模型。那麼你的控制器只需要:

@avail = Productavailability.for_isbn(@isbn) 

但我不會擔心它,直到你開始重複自己。

我不熟悉formtastic,所以我不能幫你。

+0

Brilliant,ta。有趣的是,你建議把代碼放在控制器中 - 我擔心通過創建另一個(胖控制器)來解決一個問題(一個擠滿的視圖)。讓重構開始! – snowangel

+0

@snowangel:控制器中的一些額外的行不完全是「胖」,特別是當它只是通過爲視圖設置一些數據來完成其工作時。如果你正在做很多事情,那麼你可以把大部分時間都推到你模型中的一個方便的方法中,就像我更新我的答案一樣。 –

+0

是的,我有很多 - 你的建議是非常寶貴的,謝謝。除了更好的可維護性原因,是否將內容推入控制器和模型可以提高性能? – snowangel