2014-04-09 27 views
49

Kullanıcılarım için bir gösterim sayfam var ve her bir özellik yalnızca o sayfada görünmemeli, boş değilse ve boş bir dize değilse. Aşağıda benim denetleyicim var ve her değişken için aynı satır @user.city != nil && @user.city != "" yazmak zorunda oldukça sinir bozucu. Kendi yöntemlerimi oluşturma konusunda fazla aşina değilim, ancak bir şekilde böyle bir şey yapmak için bir kısayol oluşturabilir miyim: @city = check_attr(@user.city)? Yoksa bu prosedürü kısaltmanın daha iyi bir yolu var mı?Rails kısayolunda boş olup olmadığını kontrol et.

users_controller.rb

def show 
    @city = @user.city != nil && @user.city != "" 
    @state = @user.state != nil && @user.state != "" 
    @bio = @user.bio != nil && @user.bio != "" 
    @contact = @user.contact != nil && @user.contact != "" 
    @twitter = @user.twitter != nil && @user.twitter != "" 
    @mail = @user.mail != nil && @user.mail != "" 
end 

cevap

139

sizin için yapar bir yöntem var. Boş dizeler, boşluk veya sekmelerden oluşan dizeler mevcut değildir.

bu desen bile kısayol ActiveRecord içinde var çok yaygın olduğu için:

def show 
    @city = @user.city? 
end 

Bu kabaca eşittir. Bir not olarak, nil vs testi neredeyse her zaman gereksizdir. Ruby'de yalnızca iki mantıksal yanlış değer vardır: nil ve false. Değişken false değişmez değeri için mümkün olmadığı sürece, bu yeterli olacaktır:

if (variable) 
    # ... 
end 

Bu arada gösterir zamanki if (!variable.nil?) veya if (variable != nil) şeyler tercih edilir. Ruby daha indirgemeci bir ifade türüne sahip olma eğilimindedir. Eğer true, false veya nil olabilen bir tri-devlet değişkeni varsa ve son iki durum arasında ayrım yapmak gerekirse VS. nil karşılaştırmak isterdim

bir nedeni olduğunu.

+6

Not, Ruby 2.3.0 olarak, pek çok kurtulmak olabilir gereksiz nil yalnız işleç kullanarak kontrol eder, bir şey gibi eğer @ user && @ user.authenticated' basitçe 'if @ user & .authenticated' olabilir –

8

Sen ActiveSupport ile birlikte gelen .present? kullanabilirsiniz.

@city = @user.city.present? 
# etc ... 

Bu

Bir şey boş olup olmadığını test etmek istiyorsanız, .blank? (kullanabilirsiniz dikkati çekiyor
def show 
    %w(city state bio contact twitter mail).each do |attr| 
    instance_variable_set "@#{attr}", @user[attr].present? 
    end 
end 

bu tersidir gibi yazmak bile olabilir (.present?)

Ayrıca, foo == nil'u kullanmayın. Bunun yerine foo.nil? kullanın. değil- nil artı içeriğine sahiptir için

def show 
    @city = @user.city.present? 
end 

present? yöntem testleri:

+0

İlk satırın nasıl çalışacağını açıklayabilir misiniz ..? –

+0

@Mayank, OP bir örnek değişkenini 'true' /' false 'değerine ayarlıyor. 'alıcı' boş olmayan bir değer ise reciever.present? Lütfen daha fazla açıklama için bağlandığım dokümanlar bölümüne bakın. – naomik

+0

Teşekkürler, ama örnek_variable_set "@ # {attr}", @user [attr] .present nasıl anlayamıyorum? çalışacak..? –

İlgili konular