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?
5
A
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".
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
1
próbowałem, ale jak mogę odwołać się do "wewnętrznego" marki? – sker
Ok, rozumiem. Atrybuty są przechowywane w @atrybutach, więc mogę po prostu wywołać @attributes ['brand'] wewnątrz metody. Dzięki za pomoc. – sker