wojtas
June 11, 2010, 11:49am
1
Witam mam problem z dostaniem się do atrybutu.
Oto debug z mojego entry.user:
— !ruby/object:User
attributes:
id: “1”
avatar_content_type: image/jpeg
description: Lorem ipsum dolor sit amet.
login: testowy
password: “654321”
created_at: 2010-06-11 10:03:39
attributes_cache: {}
Nie mogę za nic dostać się do loginu w widoku
Próbowałem entry.user.login i entry.user[:login], ale bez skutku. Proszę o pomoc.
drogus
June 11, 2010, 11:51am
2
Co to znaczy bez skutku? Dostajesz jakiś błąd, nil czy może coś innego?
wojtas
June 11, 2010, 11:55am
3
Przy entry.user.login dostaje - undefined method `login’ for nil:NilClass,
a przy entry.user[:login]:
You have a nil object when you didn’t expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]
wojtas
June 11, 2010, 12:09pm
4
Poradziłem sobie tak
<% if !entry.user.nil? %>
<%= entry.user.login %>
<% end %>
Nie bardzo rozumiem dlaczego, ale działa. Jak by ktoś mógł wyjaśnić, to proszę o info. Z góry dzięki.
tjeden
June 11, 2010, 12:19pm
5
entry.user jest po prostu puste (nil).
Twój kod można zapisać trochę ładniej:
<% if entry.user.present? %>
<%= entry.user.login %>
<% end %>
sevos
June 11, 2010, 1:06pm
6
Dodam, że innym sposobem jest użycie metody try:
<%= entry.user.try(:login) %>
albo tak
<%= entry.user.login rescue "urwali wam od użytkownika" %>
tjeden
June 14, 2010, 9:42am
8
Seewer +1
Ale swoją drogą, uważam, że mój sposób mimo, że najdłuższy jest chyba najbardziej elegancki.
drogus
June 14, 2010, 10:23am
10
wojtas: tak na marginesie, sytuacja, w której entry nie ma przypisanego użytkownika jest Ci w ogóle do czegoś potrzebna? Bardzo często widzę w projektach jakieś rescue/try powrzucane asekuracyjnie w widokach, kiedy tak naprawdę można by dodać walidację i mieć tego typu problemy z głowy.
hehe ja też jestem za TRY.
Jest to rozwiązanie eleganckie.
Zależy, w jakim kontekście używamy danych użytkownika. Jeśli jest to coś w stylu userboksa, to o wiele wygodniejsze będzie rozwiązanie z ifem (w zasadzie próba użycia try wydaje się być w poniższym przypadku nieco bezsensowna).
[code Ruby]if current_user
= image_tag current_user.avatar
= current_user.name
bla bla bla
else
“Nie jesteś zalogowany”
end
[/code]