2010-02-27 26 views
12

Yalnızca bir @foo isimli nesne ayarlanmışsa bir metin satırı görüntülemek istiyorum. Bunun nedeni new_record? yöntemin olur eminim You have a nil object when you didn't expect it! dönen,Ruby'de bir nesnenin görünümde sıfır olup olmadığını nasıl kontrol edebilirim?

<% if [email protected]_record? || [email protected]? %> 
    Foo is not a new record or nil 
<% end %> 

Ama bu başarısız: Bence , böyle bir şey çalışıyorum. Bir şeyin yeni bir kayıt olup olmadığını veya bir hataya neden olmadan nil olduğunu nasıl kontrol ederim? PHP'de, if(!empty($foo)) sorularak elde edilebilir, ancak raylardaki empty? yöntemi bile aynı hatanın döndürülmesine neden olur.

Herhangi bir fikrin var mı? Ben if @foo && @foo.id tarafından

cevap

13

ne dersiniz:

<% if [email protected]? && [email protected]_record? %> 
    Hello! 
<% end %> 

Öncelikle, herhangi ActiveRecord nesne en az birinin gereksinimlerini karşılayan beri kullanarak VE mantık yerine burada VEYA mantık gereken " "sıfır" veya değil yeni bir kayıt ".

İkincisi, nil kontrol ilk İlki başarısız olursa ikinci çek çalışmaz olmasını sağlar. Hata, #new_record?'u desteklemeyen bir nesne üzerinde kullanamayacağınız için atılır, bu nedenle ilk önce sıfırlama, bu yöntemin hiçbir zaman bir sıfırda çalıştırılmamasını sağlar.

+0

en sezgisel! teşekkür ederim! –

+1

DeMorgan Yasası ile: "@ foo.nil? || @ Foo.new_record ?; 'Merhaba!' 0: –

+4

'! foo.nil?' beynimi boşaltır çünkü basitçe 'foo' ile değiştirilebilir. @foo eğer –

1

kontrol ederim. Bu, bir @foo activerecord nesnesi olduğunu kontrol eder ve id alanının boş olmadığından emin olur. id alanı boşsa, bu henüz veritabanında bir kayıt olmadığı anlamına gelir. Tabloda id alanını kullandığınızı varsayalım.

+0

en özlü! teşekkür ederim! –

3

Sen de bu ilginizi çekebilir:

<%= @foo.text if @foo.present? %> 

veya

<%= @foo.text unless @foo.blank? %> 
+0

'foo.new_record @ &&' @foo boşsa bu kontrol yok, ama çalışmıyor bu gibi ekstra yöntemlere –

1

basit bir yolu

<% if [email protected](:new_record) %> 
    Hello! 
<% end %> 
+0

için teşekkürler arar:?! Bu çok basit ve yaygın yakut deyim Yapımı –

1

bu nesne zaman sıfır olabilir bir nedeni var mı manzaraya mı geliyor? Bazen görüşte şartlı mantık ekleyerek, bir şeyin yeniden düzenlenebileceğini ve daha büyük bir sorunun maskelenebileceğini gösteren bir işaret olabilir.

0

ben çok bu çekler için andand gem kullanmayı tercih ediyorum.

if @foo.andand.id 
    "Hello!" 
end 

arama .id sadece olmayan nil nesnelere yapılacaktır. Sadece eğlence için başka bir cevap atalım.

2

unless @foo.nil? or @foo.new_record? 
    "Hello" 
end 
İlgili konular