0

これらの2ビットのビューコードをリファクタリングするにはどうすればよいでしょうか?Rails 3 views refactoring:conditionals and finds

<%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のブランチ(通常はそうではありませんが)が悪いので、コードを読みにくくするだけです。

また、<li>の出力を得るには、Supplydetail.find_all_by_isbn_id(@isbn)Productavailability.find_by_code(...)を2回計算するだけです。どちらもしないでください。

そして、ERBノイズを減らすために、そのロジックの大部分をコントローラに(あるいはどこでどのくらい頻繁に使用されているかに応じてヘルパーに)プッシュしたいと思うかもしれません。

多分このような何かがあなた(あなたのコードを維持する者)に役立つでしょう。最初のコントローラのもののビット:あなたの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に精通していないので、私はそれを手伝ってはいけません。

+0

Brilliant、ta。コントローラーにコードを入れることをお勧めしますが、面白いことに、別のコントローラーを作成して1つの問題(ジャムで圧縮したビュー)を解決することを心配していました。リファクタリングを開始しましょう! – snowangel

+0

@snowangel:コントローラのいくつかの余分な行は、正確には "太っている"わけではありません。特に、ビューのデータをいくつか設定して仕事をしているだけです。多くのことをしているのであれば、私の答えを更新したときのように、モデルの便利なメソッドにそのほとんどをプッシュすることができます。 –

+0

はい、私はたくさんのことを持っています - あなたのアドバイスは貴重です、ありがとうございます。より保守性の理由だけでなく、コントローラーやモデルの内容を改善してパフォーマンスを向上させますか? – snowangel