2009-08-20 19 views
6

Więc w zasadzie mam kontroler. coś takiego toDostęp do właściwości modelu w Railsach

def show 
@user = User.find[:params[id]] 
#code to show in a view 
end 

Użytkownik ma właściwości takie jak imię i nazwisko, adres, płeć itp. Jak uzyskać dostęp do tych właściwości w modelu? Czy mogę na przykład przeciążyć nazwę modelu dostępnego dla nazwy i zastąpić ją własną wartością lub połączyć coś z nią. Podobnie jak w widoku show.html.erb dla tej metody, może chciałbym połączyć nazwę użytkownika z "Panem" lub "Pani" w zależności od płci? Jak to jest możliwe?

Odpowiedz

9

wahałbym zastąpić atrybuty, a zamiast dodać do modelu jak ten:

def titled_name 
    "#{title} #{name}" 
end 

Można jednak uzyskać dostęp do pól bezpośrednio tak:

def name 
    "#{title} #{self[:name]}" 
end 
+0

Czy drugi blok kodu nie byłby wywołany rekurencją i zawieszeniem? –

0

Możesz łatwo przeciążyć atrybuty zgodnie z własnymi sugestiami.

tj jeśli nazwa jest pole w tabeli bazy danych użytkowników, możesz zrobić:

def name 
    "#{title} #{read_attribute[:name]}" 
end 

Funkcja read_attribute zwróci wartość kolumny bazy danych na polu.

Zastrzeżenie: Nie jestem pewien, czy to dobry pomysł. Jeśli chcesz zastosować metodę, która wyświetla dane modelu w zmodyfikowany sposób, byłbym skłonny nie przeciążać domyślnych metod i nazwać ich czymś innym - pozwoli to uniknąć pewnego poziomu zaciemniania.

Dokumentacja tutaj: http://api.rubyonrails.org/classes/ActiveRecord/Base.html (pod 'Zastępowanie domyślnych akcesorów')

+2

chcieć uważać to robić, jak to może mylić interfejs. Może być dziwnie, robiąc imię = "Joe" i wracając "Pan Joe". –

+1

Nie wspominając, że ten kod działa tylko wtedy, gdy baza użytkowników nie zawiera żadnych kobiet. ;) –

+0

@Sarah, ah, masz całkowitą rację, zrobię na to poprawkę. @Jamie - tak, zgadzam się, stąd zastrzeżenie, które jest w mojej odpowiedzi. – DanSingerman

0

W przypadku uzyskiwania dostępu do danych przechowywanych w bazie danych bezpośrednio można to zrobić w was zobaczyć:

<%= @user.firstname %> 
<%= @user.gender %> 

itp

Jeśli chcesz zbudować niestandardowe reprezentacje danych, musisz utworzyć pomocników lub rozszerzyć model (jak wyżej).

+0

Potrzebuję tych w modelu. Wiem, jak je zdobyć w widoku. –

0

I mają tendencję do używania metody pomocnika dodane do modelu o takich rzeczach:

def formatted_name 
    "#{title} #{first_name} #{last_name}" 
end 

(Edycja poprzedni post spojrzał na mojego kodu i realizowane pomocnicy mają być dla związane prezentacja-(marża. znowu w górę) rzeczy tylko.)

(Edit usunąć lewej nad parametru ... Rany, nie wystarczająco dużo kawy rano.)

(Edycja ponownie zastąpić $ z # ... Może powinienem po prostu usunąć ten jeden huh?)

+0

Te dolary powinny być haszami. –

5

Można utworzyć atrybutów wirtualnych w ramach twój model do reprezentowania tych struktur.

Jest railscast na ten sam temat, ale w skrócie można zrobić coś takiego w modelu

def full_name 
    [first_name, last_name].join(' ') 
end 

def full_name=(name) 
    split = name.split(' ', 2) 
    self.first_name = split.first 
    self.last_name = split.last 
end 

Jeśli chcesz wyraźnie zmienić wartość atrybutu podczas odczytu lub zapisu można użyć metody read_attribute lub write_attribute. (Chociaż uważam, że mogą one być przestarzałe).

Te prace polegają na zastąpieniu metody akcesora atrybutu własnymi. Jako przykład, pole identyfikatora oddziału można wprowadzić jako xxxxxx lub xx-xx-xx. Możesz więc zmienić metodę branch_identifier =, aby usunąć łączniki, gdy dane są przechowywane w bazie danych. Można to osiągnąć jak tak

def branch_identifier=(value) 
    write_attribute(:branch_identifier, value.gsub(/-/, '')) unless value.blank? 
end 
Powiązane problemy