2010-03-04 11 views
31

Burada en iyi yaklaşımı yaptığımdan emin değilim, ancak bir arama yapıldıktan sonra göstermek istediğim bir veri bloğum var ve hiç orada olmamak önce. Her şeyden önce, gösterilecek bir şey yoktur ve ikinci olarak referans aldığı model sıfırdır, bu yüzden bir istisna atar.Ruby on Rails: koşullu olarak bir kısmi gösterme

Bu bloğu kısmi bir şablona yerleştirdim ve yerleşimi uygun bir noktaya ekledim. Kısmi şartlı olarak temiz bir şekilde işlenmenin bir yolu var mı? Bu probleme yaklaşmanın daha iyi bir yolu var mı?

cevap

41

Yakut böyle güzel şeyler yapmanızı sağlar ve bunu, hangi kısmi işleneceğini söyleyen bir karmaşa geçirirsiniz. Ruby, birşeyi bir satır üzerine koymanızı sağlar (bu da özellikle görünümlerde onları daha okunaklı ve özlü hale getirir), bu nedenle if @conditions bölümü sadece düzenli bir ifade ifadesidir.

<% if @conditions %> 
    <%= render :partial => "foo/bar" %> 
<% end %> 

Düzenleme: Aynı zamanda gibi yapılabilir

Yakut da if yerine unless anahtar kelimeyi kullanmasını sağlar. Bu, kodu daha da okunabilir hale getirir ve negatif karşılaştırmalar yapmak zorunda kalmanızı engeller.

<%= render :partial => "foo/bar" if [email protected] %> 
#becomes 
<%= render :partial => "foo/bar" unless @conditions %> 
+0

'<% = render: kısmi =>" foo/bar "@conditions%>, aradığım özlülük. Aşağıdaki yorumunuzla ilgili olarak, endişelerin ayrılması konusunda tamamen dogmatik olmanın aptalca olacağını kabul ediyorum. Bu aslında Rails'in Django'nun sahip olduğu bir sisteme karşı esnekliği cezp etmesini istediğim bir sebep. Ama mümkün olduğunda sınırlamak isterim. Kabuslarım günbatımına dek klasik asp yapıyor, sanırım. Yardım için teşekkürler! –

+0

Sorun değil. ASP gibi bir şeyden geçiş yapmanın zor kısmı, uygulamanızın/iş mantığınızın nerede bittiğini ve görüş mantığının nerede başladığını tanımlamaktır. –

5

Kolay bir yöntem, bir yardımcı yöntem kullanmaktır. Yardımcılar, mantığı doğrudan görünümden koymaktan biraz daha temiz olmaya eğilimlidirler. Varsayarsak şeyler daha uygun adlandırılır açıkçası

def render_stuff_conditionally 
    if @contional_check 
    render :partial => 'stuff' 
    end 
end 

+0

Mantıklı, bir yardımcıya mantık eklemek en iyisidir. – bojo

+1

Katılmıyorum. Denetleyici mantığı ve mantık mantığı arasında belirgin bir fark vardır ve bu mantıktır. Önerdiğim gibi kısa bir tek liner olarak yapılabilir. Bu seçenek, yalnızca kodun hata ayıklanması veya bakımı sırasında hangi koşulların kontrol edildiğini bulmayı zorlaştırır. –

+2

Bence, bir yardımcısı kullanarak veya kullanmamanızdan ne kazanacağınızı ve ne düşündüğünüzü düşünmeye değer. Bir yardımcıya doldurmayı düşündüğünüz kod görüşün okunabilirliğini artıracaksa, sizin için değerli olabilir. Görünümü içinde koşullu (veya herhangi bir kod) bırakılması, kodun daha okunabilir ve sürdürülebilir olmasını sağlarsa, göz önünde bulundurulması gereken bir şey vardır. Yardımcılar, her türlü kod için her şeyi yakalayabilirler. Bu durumda, görüş kodunuz güzel olabilir, ancak sadece "balonu sıkıştırdınız" (ve karmaşa gitmedi). – Tass

1

: Bu kontrol etmek için bir yöntem olurdu

<%= render_stuff_conditionally %> 

ve yardımcı:

Yani, görünümü gibi bir şey olabilir Seni doğru takip ediyorum, bunu görüş seviyesinde yapıyorsun.

<% if [email protected]_search_data.nil? %> 
<% render :partial => 'foo/bar' %> 
<% end %> 

Yardım eder. Aksi takdirde, kodunuzun bir örneğini yayınlayabilirsiniz. ,

<%= render(:partial => "foo/bar") if @conditions %> 

render bir işlevdir: o kadar yazılabilir,

<%= render :partial => "foo/bar" if @conditions %> 

okuyup anlamak için bu biraz daha kolay hale getirmek için:

+1

Aslında yanıt beklerken yaptığım bu. Çalışıyor, ancak mantıklı bir şekilde şartlı mantıktan kaçınmayı tercih ediyorum. –

+0

Pete'in çözümü, bu durumda gitmenin en iyi yoludur. – bojo

+0

@Donald: Görüşlerde mantıktan kaçınmaya gerek yok. "View mantık" ve "uygulama mantığı" arasında ince bir çizgi var. –