Błąd (nawet nie wiem jak go nazwać)

Showing app/views/items/_form.rhtml where line #11 raised:

[quote]You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occured while evaluating nil.inject[/quote]

[quote]8:


9: Kategoria
10:
11: <%= options_from_collection_for_select @categories, “id”, “category”, @item.category_id %>
12:
13:
14: [/quote]
Gdzie leży błąd?

Tabela categories w bazie danych ma kilka wpisów…

Jedna ze zmiennych jest NILem (zdaje się że @categories) - nie została zainicjalizowana, a Ty (pośrednio) odwołujesz się do metody inject na tej zmiennej (kolekcji). Sprawdź, czy na pewno ustawiasz tą zmienną w kontrolerze.

Czy @categories jest tablica? (czyt. czy na pewno cos tam jest?)

http://blueman.in5.pl/ruby/ToDo/public/categories - tak. Zawartość tablicy categories jest pewna :wink:
http://blueman.in5.pl/ruby/ToDo/public/items/new - a tutaj kod błędu :stuck_out_tongue:

Adept - a trochę jaśniej można? :frowning:

Jak widzicie dopiero się uczę :wink: robie aplikacje ToDo z tutoriala za rączkę. Już w samym tutku było parę błędów/literówek i niejasności, ale do tej pory rozwiązywałem je bez problemu. Z tym już nie mam pojęcia, ponieważ moja wiedza na temat Railsów się skończyła (właściwie jej brak :wink: )

Ok, w tabeli masz jakieś kategorie, ale to o niczym jeszcze nie świadczy. Czy w akcji ‘new’, kontrolera ‘items’ masz coś takiego:

@categories = Category.find(:all)

Bo atrybut @categories sam się niczym nie wypełni ;).

I zaglądnij jeszcze do logów (katalog log/), tam prawdopodobnie jest coś więcej niż “You have a nil object when you didn’t expect it!”, a także dokładniejszy trace niż ten wyrzucony do przeglądarki.

[quote]8:


9: Kategoria
10:
11: <%= options_from_collection_for_select @categories, “id”, “category”, @item.category_id %>
12:
13:
14: [/quote]
Tak jak pisze Radarek, musisz pobrać jakieś dane z BD i umieścić je w @categories find(:all), find_all jak wolisz. Tylko nie wpisuj tego w widoku, w kontrolerze będzie lepiej.
Czemu na sztywno wpisujesz <select … >?
<%= select :item, :category, Category.find(:all).collect { |c| [c.name, c.id]} %> powinno lepiej wyglądać

select (ActionView::Helpers::FormOptionsHelper)

@radarek - dzięki pomogło. Tak jak już powiedziałem - zaczynam, stąd te moje podstawowy błędy. Ale na pewno szybko się uczę. Studiuję informatykę na UŚ, więc do takich rzeczy zostałem stworzony :stuck_out_tongue:

@seban - faktycznie także i taka wskazówka pomogła po lekkich poprawkach w Twoim kodzie. Trochę inne nazwy formularza się otrzymuje, ale znacznie skraca to kod. Dzięki - zapamiętane :slight_smile:

Jeszcze jedna sprawa co do wartości nil :expressionless: już nie rozumiem tego RoR w tym momencie :stuck_out_tongue:

W bazie danych mam kolumnę ‘images’, która raz ma wartość NULL, raz ścieżkę do pliku graficznego.
To jak chciałem aby wyświetlił mi obrazki

<%= image_tag(metod.image, :size => "35x35", :border => 0) %>

to mam obiekt nil, którego się nie spodziewałem :stuck_out_tongue:
No ok, to chciałem poprzez if() rozróznić nil, i pełne wartości

<% if metod.image='' %> <%= image_tag(metod.image, :size => "35x35", :border => 0) %> <% else %> Ala <% end %>
i

<% if metod.image=nil %> <%= image_tag(metod.image, :size => "35x35", :border => 0) %> <% else %> Ala <% end %>
Ale on tak czy siak - czy pobrał jakąś wartość, czy nie to wyświetla obrazek :confused:

Może on z bazy zwraca string “NULL” (albo “‘NULL’” jak mi się zdarzało przy niektórych testach przy SQLite…) zamiast zwykłego nila.
Spróbuj po prostu wypisać wartość tego pola dla jakiejś wartości, która nie ma przypisanego obrazka.

Próbowałem już wcześniej i nic ciekawego nie wyświetlił - pusty znak (nawet nie spacja, tylko po prostu brak jakiegokolwiek znaku).

Ja korzystam z MySQL. Jak w końcu ominąłeś to ?

BTW
Railsowe ‘nil’ to to samo co NULL? Że też chciało im się zmieniać/wprowadzać nowe nazewnictwo… .

jest także sprawa przeczytania z jednej książki, dokumentacji itp.
za darmo:
http://www.rubycentral.com/pickaxe/
także tu:
http://poignantguide.net/ruby/chapter-4.html
czy choćby w wikipedii:


np.

[quote=BlueMan]<% if metod.image=nil %> <%= image_tag(metod.image, :size => "35x35", :border => 0) %> <% else %> Ala <% end %>
Ale on tak czy siak - czy pobrał jakąś wartość, czy nie to wyświetla obrazek :/[/quote]
czy w php (bo rozumiem, że to Twój poprzedni język) można zrobić “if metod.image=nil” ? lub inaczej postawione pytanie: po co Tobie przy if przypisanie?
spróbuj

<% if metod.image.nil? %>

lub:
http://www.rubycentral.com/pickaxe/tut_expressions.html
masz opisane if, unless, case, while, for i inne z Twoich poprzednich pytań.

przy wartości NULL, zwracany jest nil, w MySQLu, specjalnie dla Ciebie sprawdziłem.

dla testów użyj ./script/console Twojej aplikacji

[quote=BlueMan]BTW
Railsowe ‘nil’ to to samo co NULL? Że też chciało im się zmieniać/wprowadzać nowe nazewnictwo…[/quote]
jak to? to gdzieś jest inaczej niż nil? to są inne języki niż Ruby? że też komuś się chciało tworzyć inne języki programowania ;p

pozdrawiam