Problem z dostaniem się do atrybutu

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 :frowning:

Próbowałem entry.user.login i entry.user[:login], ale bez skutku. Proszę o pomoc.

Co to znaczy bez skutku? Dostajesz jakiś błąd, nil czy może coś innego?

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.[]

Poradziłem sobie tak :slight_smile:

<% 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.

entry.user jest po prostu puste (nil).

Twój kod można zapisać trochę ładniej:

<% if entry.user.present? %> <%= entry.user.login %> <% end %>

Dodam, że innym sposobem jest użycie metody try:

<%= entry.user.try(:login) %>

albo tak

<%= entry.user.login rescue "urwali wam od użytkownika" %>

Seewer +1 :smiley:

Ale swoją drogą, uważam, że mój sposób mimo, że najdłuższy jest chyba najbardziej elegancki.

TRY lepszy :slight_smile:

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.

Głosujmy!

Też jestem za TRY :slight_smile:

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]