2008-10-08 13 views
5

Załóżmy, że mam ten model o nazwie Produkt z polem o nazwie o nazwie. Załóżmy, że wartości marki są przechowywane w formacie this_is_a_brand. Czy mogę zdefiniować metodę w modelu (lub gdziekolwiek indziej), która pozwala mi zmodyfikować wartość marki, zanim zostanie wywołana. Na przykład, jeśli zadzwonię pod numer @ product.brand, chcę uzyskać . Jest to marka, zamiast this_is_a_brand.Ruby on Rails - Czy mogę zmodyfikować wartość atrybutu przed wywołaniem?

Odpowiedz

9

Polecam przy użyciu składni kwadratowego nawiasu ([] i []=) zamiast read_attribute i write_attribute. Składnia nawiasów kwadratowych jest krótsza i designed to wrap the protected read/write_attribute methods.

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

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

W swoim modelu można zastąpić wywołanie metody brand.

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

Pozwoli to na zapisanie go jako this_is_a_brand. Ale zostanie zwrócony jako "to jest marka".

+0

próbowałem, ale jak mogę odwołać się do "wewnętrznego" marki? – sker

+0

Ok, rozumiem. Atrybuty są przechowywane w @atrybutach, więc mogę po prostu wywołać @attributes ['brand'] wewnątrz metody. Dzięki za pomoc. – sker

7

Zamiast dostępu @attributes bezpośrednio, należy użyć read_attribute i write_attribute:

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

Co oznacza idiom b && b.transform_in_some_way? – sker

+0

Dlaczego lepiej używać tych metod? – sker

+0

Czekaj, rozumiem. Dzięki za pomoc. – sker

1

Jako ostatnia odpowiedź została wysłana 7 lat temu, będę przyczyniać co Rails API obecnie sugeruje.

def brand 
    super.humanize 
end 

Humanize zamienia 'this_is_a_brand' do 'Jest to zupełnie'