Zacząłem prezentację Grails od omówienia jego składowych - klasy dziedzinowe, kontrolery, strony GSP i wzmianką o klasach usługowych, pomocniczych i znacznikach GSP. Na poparcie moich słów postanowiłem zaprezentować przykładową aplikację bez użycia IDE, jedynie z użyciem polecenia grails.
Najpierw grails help dla rozruszania publiczności czymś działającym. Później grails create-app nauczyciel, a następnie grails create-domain-class pojecie i grails create-controller pojecie. Miałem pustą klasę dziedzinową oraz domyślny kontroler, który wyglądał tak:
class PojecieController {Sądząc, że mam wszystko podszedłem do uruchomienia aplikacji z grails run-app.
def index = { }
}
$ grails run-appOtwieram przeglądarkę pod adresem http://localhost:8080/nauczyciel, wybieram jedyny dostępny kontroler PojecieController i...bum!
Welcome to Grails 1.1-RC2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: c:/apps/grails
Base Directory: C:\projs\sandbox\nauczyciel
Running script c:\apps\grails\scripts\RunApp.groovy
Environment set to development
...
Running Grails application..
Server running. Browse to http://localhost:8080/nauczyciel
Trochę mnie to wprawiło w zakłopotanie, szczególnie, że to dopiero początek moich programistycznych wyczynów z Grails podczas prezentacji (!) Wcześniej, jakimś cudem, nie przytrafiło mi się to. Na sali było około 50 osób i na moje pytanie o jakiekolwiek (nawet minimalne - samo czytanie o nim) doświadczenia z Grails rękę podniosła wyłącznie jedna osoba (nie czytają mojego bloga?!). Byłem w tarapatach.
Sądząc, że to brak *czegoś* zabrałem się za podobną aplikację z użyciem NetBeans 6.7. Nie trwało długo zanim okazało się, że nie jest lepiej - znowu 404. Chwila zadumy (a wszyscy z sali patrzą) i mam rozwiązanie! Wszystko za sprawą cudownej zasady konwencja-zamiast-konfiguracji (ang. CoC - Convention over Configuration).
I teraz pytanie do czytelników: Dlaczego otrzymałem błąd 404? Jako podpowiedź napiszę, że wszystkie dane do rozwiązania problemu są w tym wpisie. Trochę logicznego myślenia i znalezienie rozwiązania stanie się banalne (poodbnie jak te dowody twierdzeń z wykładów analizy matematycznej ;-)).
Jacku to jeszcze jeden tip od publiczności z sali. Elvis to skrócony ternariusz (ang. ternary operator) a oparator, który pokazywałeś czyli *. to spread operator.
OdpowiedzUsuńBrak index.gsp?
OdpowiedzUsuńWhat did you want to view?
OdpowiedzUsuńŁukasz, Grzegorz strzelajcie dalej. Jackowi chodzi o to dlaczego w ogóle Grails szuka pliku widoku? Powinien przecież zadziałać scaffolding.
OdpowiedzUsuńTeraz to jasne, chodzi oto co poniżej?
OdpowiedzUsuńclass PojecieController {
def scaffold = Pojecie
def index = { }
}
Tjaaa, z pomoca kogos z sali, przez przypadek tym ktosiem bylem ja :) Btw. Gdybys zajrzal do mnie na bloga wczoraj to zobaczylbys dokladnie to samo co probowales stworzyc na prezentacji.
OdpowiedzUsuńJsp? W grails?
OdpowiedzUsuńgrails generate-view Pojecie :)
OdpowiedzUsuńDlatego ja zwykle modeluję ile jestem w stanie Encję, a potem robie grails generate-all Encja. W ten sposób się nie zapomni :)
Jeszcze jedno w sumie - pewnie wiesz, ale jak użyjesz generate-controller zamiast create-controller to troszeczkę więcej jest w tym kontrolerze niż tylko index ;)
OdpowiedzUsuńAby scaffolding działał model musi posiadać przynajmniej jeden atrybut.
OdpowiedzUsuń