Sarah, hi! Great stuff!
I have some more answers for you which I'll give you in the context of
a reply to Joel, expanding on what he says, and correcting some things
where I think he might have misunderstood what the students were
trying for --
So, replying to Joel --
On May 28, 2009, at 10:09 PM, Joel Fernandes wrote:
1. couldn't find 'url' in the shoes manual, probably what you're
looking for is 'link'
Actually, they probably do mean "url" -- as in a multiple-page app
like this little demo:
class TwoPages < Shoes
url '/', :mainpage
url '/other', :otherpage
def mainpage
para "this is the main page... "
para link("this way to the other", :click => '/other')
end
def otherpage
para "this is the other page... "
para link("this way to the main page", :click => '/')
end
end
Shoes.app
This stuff is in the Nobody Knows Shoes book, p. 43.
Shoes urls only work when you subclass Shoes, as I did here:
class TwoPages < Shoes
then you can define different pages with urls and symbols and methods
named after those symbols.
When you just put stuff inside the Shoes.app block, you don't need to
(and can't) use urls and different pages defined that way.
So... to make this work they'd have to use a subclass of shoes, like
this:
class OurApp < Shoes
url '/', :index
[...stuff...]
end
Shoes.app # you always need this line, to make stuff happen
Next step -- get rid of the "index" line -- the index method gets
called automagically because it is assigned to the url "/" in the
"url" line.
Third step -- as you said, the assignments of click handlers are
taking place in a different context than the index method; they don't
work together right at all that way. I don't know how I'd explain
exactly how that works to the students, honestly, cause I'm a little
fuzzy myself, but here's how I'd sum it up in a very simple rule:
When you're doing the thing with the pages and URLs, you've got to put
EVERYTHING for a page inside the method for that page ("def
index...end"). EVERYTHING. Nothing goes outside those methods, cause
those methods build all the pages of the app (in this case, the one
page of the app, "index".
So all those click handlers go inside the "def index....end".
Final thing -- click handlers on buttons have to be actual code, not a
Shoes URL, so this line won't work:
button "Go Back", :click => "/"
You can fix it two ways. You can make it a link:
para link("Go Back", :click => '/')
Or you can use the "visit" method to visit the URL, in a block of code
attached to the button:
button "Go Back" do
visit "/"
end
So a full working app with those changes -- subclass Shoes, get rid of
the call to index(), move the click handler assignments into "def
index...end" and fix the button so it visits the Shoes URL right --
would look like this -- and with those four small changes, it works
great!
======================cut here===============
class OurApp < Shoes
url '/', :index
def index
clear
para "Which is correct?"
stack {
@correct = button "A bed of clams"
@wrong1 =button "A coalition of cheetahs"
@wrong2 =button "A gulp of swallows"
}
@correct.click {
clear
para "Correct"
image "http://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Balloons-aj.svg/550px-Balloons-aj.svg.png
"
button "Go Back" do
visit "/"
end
}
@wrong1.click {
clear
para "Wrong!"
image "http://icanhascheezburger.files.wordpress.com/2007/05/cheez_doing_it_wrong.jpg
"
}
@wrong2.click {
clear
para "Wrong, your consolation prize is..."
image "http://farm2.static.flickr.com/1166/1230713908_083d7f6c53_o.jpg
",
:width => 500
}
end # this is the end of the index method, which lays out the "/"
page
end # this is the end of the subclass, which contains all the pages
(well, one page)
Shoes.app
======================cut here===============