2016-03-28 20 views
0

Bir Kullanıcının bir Rails uygulamasında bir gönderi veya yorum düzenleyip düzenleyemeyeceğini kontrol etme yöntemim var. Bir kullanıcı kuruluşlar her iki türdeki sahip olabilirler, çünkü bu yöntem bir parametre post_or_comment olarak bunlardan birini almak yapmaya karar: Bu muğlak bir parametre olarak bu gibi herhangi bir nesneyi almak için iyi bir uygulama mıBu kullanıcı yöntemi parametresi iyi adlandırılmış mı?

class User < ActiveRecord::Base 
    def can_edit?(post_or_comment) 
    post_or_comment.user == self || self.admin? 
    end 
end 

ve yapar Parametre için seçtiğim isim anlamlı mı?

CanCan gibi sofistike bir kullanıcı rolü işleyicisi ile ilgilenmiyorum, öğrenmeyi ve basit tutmayı tercih ediyorum.

+4

İki yöntem olarak iki ayrı test yapmalıyım, daha sonra ikisini bir kolaylık olarak gösteren bir üçüncü. Bu test yaparken daha iyi ayrıntılara izin verir. Bir yönetici rolü olduğundan, yöneticinin yapabileceği şey çok açık, özellikle de kodu başkalarıyla paylaşmayı düşünüyorsanız. Herhangi bir değişken türü almak, gelecekte güvenli bir şekilde çalışmaya başlayacağınızdan emin olmak için gelecekte akıllıca ısınabilir. 'Post_or_comment' gibi parametre adları iyi, ancak kod ya da olmayan bir parametreyi kabul ederse, muhtemelen bunu bilmek ve doğru bir şekilde ele almak istersiniz. –

+0

Bir şansınız olduğunda, buna bir örnek verebilir misiniz? –

cevap

1

Şema içinde bir gönderinin bir yorum türü olduğu veya tersi olduğu anlaşılırsa, o zaman her iki tür için de eşit olarak uygulanacağı anlamına gelen bir veya başka bir biçim olarak ifade etmek için kafa karıştırıcı bir şey değildir. .

Genel olarak, iyi bir nedeniniz olmadığı sürece işleri aşırı kısıtlamaktan kaçınmak en iyisidir.

def can_edit?(thing) 
    # Admin can edit anything. 
    return true if (admin?) 

    case (thing) 
    when User 
    # Users can edit themselves 
    thing === self 
    else 
    if (thing.respond_to?(:user)) 
     # If the owner matches. 
     thing.user === self 
    else 
     # Don't really know, so say no by default. 
     false 
    end 
    end 
end 

bu kodu için en kötü durum başarısızlık durumu öyle mi: bunu sahipsiz bir şeyi geçiyoruz çünkü Orada muhtemelen çoğu zaman işleri bir birine çok özel bir yöntem dönüm yolları, ve değilse bu kadar "hayır" diyor. Artık bir user mülküne sahip olabilecek veya olmayabilecek keyfi şeylerden geçebilir ve beklendiği gibi çalışacaktır. Diğer özel durumlar için, case ana sayfasına başka bir when ekleyebilirsiniz.

+0

Teşekkür ederim, bunu çok yararlı buldum ('response_to?' Hakkında bilmiyordum). Soru: == 'yerine üçlü eşitliği kullanmanın bir nedeni var mı? –

+0

@RolandoMurillo Her ikisi de burada çalışabilir, ancak emin olmak için test etmeniz gerekir. ActiveRecord'un iki modeli karşılaştırmak için kullandığı gibi, 'id' tabanlı eşdeğer kayıtlar olduğunu iddia etmek için geçmişte '===' kullandım. – tadman

İlgili konular