2013-11-15 14 views
10

Şu anda tabii ki, kötü bir şey olduğunu benim görünümleri, bazı hesaplamalar sahnede oluyorum: Yukarıdaki sorunu refactor bana yardımcı olacak yollar araştırıyorumRaylar - hesaplamaları görünümlerimden mi sıyrılıyor?

<% categories.each do |c| %> 
    .... 
    <%= c.transactions.sum("amount_cents") %> 
    .... 
<% end %> 

.

Bir şey muhtemelen daha iyi bir çözümdür benim denetleyicisi

@category_sum = @transaction.sum("amount_cents") 

için hesaplama taşımaktır, ama biliyorsun. Mükemmel değil.

birçok kullanıcımız var beri, benim Model içine hesap mantığı taşıyabilirsiniz nasıl görmüyorum. Öyleyse sanırım yeni bir Sınıf kullanmam, bir sürü yöntem (toplam, ortalama, vb.) Oluşturmam ve bunları görüntülerde kullanmam gerekebilir. Doğru yolda mıyım? Kodumun nasıl yeniden yapılandırılacağı ve bu Sınıfı nasıl tasarlayacağınız ve uygulayacağınız konusunda tavsiyeleriniz için teşekkür ederiz.

+0

Eğer c nesneden html döndüren bir yardımcı yöntemini oluşturabilirim? ve daha sonra .html kasa ile yardımcıdan sonuç enjekte edilsin mi? – ant

cevap

9

Bir görüşe göre mantık sunum kullanmaktır izole etmek anlamına gelir. Eğer birçok yöntemler varsa iyi kullanılırsa, Tabii

class CategoryPresenter < BasePresenter 
    presents :category 

    def transaction_sum 
    category.transactions.sum("amount_cents") 
    end 
end 

: Daha sonra app/presenters/category_presenter.rb bir sunum sınıf var

<% categories.each do |c| %> 
    .... 
    <% present c do |category| %> 
    <%= category.transaction_sum %> 
    <% end %> 
    .... 
<% end %> 

:

bir sunum böyle bir şey yapmanızı sağlar Bu sunum yapan kişi (ama görüntü mantığını azaltmaya başladığınızda, sunumcuları doldurmak hızlıdır).

burada kullanılan uygulama this pro railscast tarif dayanmaktansa. Temel fikir, nesne sınıfına dayanan bir sınıf adı açan, uygun sunum sınıfını yükleyen ve başlatan bir #present yardımcısına sahip olmaktır.

bir diğer popüler alternatif dekoratör kavramını kullanmak drapper kullanmaktır, fakat bir sunum temelde bir dekoratör olduğunu.

+0

harika bir fikir adamı! ;) – apneadiving

+0

biliyorum, bazı harika adam bana gösterdi;) –

+0

Öğrenmek için birkaç gün sürdü, ama tamamen buna değer! Bu cevap için teşekkür ederim. –

2

Gördüğünüz ana kod kokusu, the law of Demeter olarak adlandırılır (pek çok programlama "yasası" gibi), daha çok bir "Demeter" yönergesi gibi düşünmeniz gerekir). Yapabileceğin Ne

kategorisinde, örneğin bir yöntem haline fiili hesaplama adımı taşımak olduğunu

class Category < ActiveRecord::Base 
    def transaction_amount 
    transactions.sum("amount_cents") 
    end 
end 

<% categories.each do |c| %> 
    .... 
    <%= c.transaction_amount %> 
    .... 
<% end %> 

görünümü sunarken hesaplama konuşan Teknik hala gerçekleştirilir, ancak miktarı özetlenebilir nasıl için mantık hesaplanan alır görünümünün kendi iç artık. Artık tüm bakış açıları, kategori nesnelerine transaction_amount mesajını gönderebileceğidir. Bu, aynı zamanda, toplamlar için bir önbellek eklemenize ya da gerçek kayıtları geçmeyi durdurmanıza da olanak tanır, ancak bunun yerine toplamı gerçekleştiren bir kod parçasından çıkan (ActiveRecord modelleri olmayan) statik nesneleri iletir. daha verimli bir şekilde.

İlgili konular