2008-10-08 28 views
5

Ürün adlı bu modelin markalı numaralı bir alana sahip olduğunu varsayalım. markasının markasının değerlerinin this_is_a_brand biçiminde saklandığını varsayalım. Modelde (veya başka bir yerde), çağrılmadan önce markasının değerini değiştirmeme izin veren bir yöntem tanımlayabilir miyim. Örneğin, @ product.brand'u çağırırsam, almak istiyorum. Bu, bu_is_a_brand yerine bir Marka markasıdır.Ruby on Rails - Bir özniteliğin değerini çağırılmadan önce değiştirebilir miyim?

cevap

9

yerine read_attribute ve write_attribute ait köşeli ayraç sözdizimi ([] ve []=) kullanarak öneriyoruz. Kare parantez sözdizimi daha kısadır ve designed to wrap the protected read/write_attribute methods. Geçen cevap 7 yıl önce gönderilmiş gibi

def brand 
    original = self[:brand] 
    transform(original) 
end 

def brand=(b) 
    self[:brand] = reverse_transform(b) 
end 
0

Modelinizde, brand yöntem çağrısını geçersiz kılabilirsiniz.

def brand 
#code to modify the value that is stored in brand 
return modified_brand 
end 

Bu, this_is_a_brand olarak saklanmasına izin verecektir. Ancak, "bu bir marka" olarak iade edilecektir.

+0

Denedim 'Bu bir markadır', ama nasıl "iç" marka başvuru? – sker

+0

Tamam, anladım. Öznitelikler @attributes'ta saklanır, böylece yöntem içinde @attributes ['brand'] 'ı arayabilirim. Yardım ettiğin için teşekkür ederim. – sker

7

Aksine doğrudan @attributes erişen yerine, read_attribute ve write_attribute kullanmalıdır:

def brand 
    b = read_attribute(:brand) 
    b && b.transform_in_some_way 
end 

def brand=(b) 
    b && b.transform_in_some_way 
    write_attribute(:brand, b) 
end 
+0

idiom b && b.transform_in_some_way ne anlama geliyor? – sker

+0

Ve neden bu yöntemleri kullanmak daha iyidir? – sker

+0

Bekle, anladım. Yardım ettiğin için teşekkür ederim. – sker

1

, ben Rails API anda ne öneriyor katkıda edeceğiz. için

def brand 
    super.humanize 
end 

Humanize dönüşler 'this_is_a_brand'