Rails 3 вида рефакторинга: условия и находки - PullRequest
0 голосов
/ 10 июля 2011

Что бы вы посоветовали как лучший способ реорганизовать эти два бита кода представления?

<%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 Ответ

4 голосов
/ 10 июля 2011

Прежде всего, пустая ветвь if в if / else обычно (но не всегда!) Пахнет плохо, так что не делайте этого, это только затрудняет чтение и понимание вашего кода.

Кроме того, вы дважды вычисляете 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, поэтому не могу вам помочьс этим.

...