12. Routes
GET /cantora controllers.Application.cantora
GET /musicas controllers.Application.music
GET /agenda controllers.Application.shows
GET /novidades controllers.Application.news
GET /clients/:id controllers.Clients.show(id: Long)
map.connect
':controller/:action/:id'
13. Controllers
def cantora = Action { implicit request =>; Ok(views.html.cantora()) }
def music = Action { implicit request =>; Ok(views.html.music()) }
def shows = Action { implicit request => Ok(views.html.shows()) }
def news = Action { implicit request => Ok(views.html.news()) }
/app/views/[method_name].scala.html
class
CantoraController
<
ApplicationController
def
index
end
end
class
NewsController
<
ApplicationController
def
index
end
end
/app/views/[controller_name]/index.erb.html
15. SQL API: Databases
val countries = SQL("Select name,population from Country")().collect {
case Row("France", _) => France()
case Row(name:String, pop:Int) if(pop > 1000000) => BigCountry(name)
case Row(name:String, _) => SmallCountry(name)
}
val result: Int =
SQL("delete from City where id = {id}").on(“id” -> 99).executeUpdate()
Active
Record:
Country.all.map
do
|c|
if
(c.name
==
“France”)
France.new
else
if
(c.pop
>
1000000) Country.delete(99)
BigCountry.new(c.name)
else
SmallCountry.new(c.name)
end
end
16. Databases
OGH
(Old Good Hibernate)
Active
Record:
Country.all.map
do
|c|
if
(c.name
==
“France”)
France.new
else
if
(c.pop
>
1000000) Country.delete(99)
BigCountry.new(c.name)
else
SmallCountry.new(c.name)
end
end
17. Migrations / Evolutions
# --- !Ups
CREATE TABLE Users (
id bigint(20) NOT NULL AUTO_INCREMENT,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL,
PRIMARY KEY (id)
);
# --- !Downs run: AUTOMATIC!
DROP TABLE Users; conf/evolutions/{database name}/{#}.sql
class
CreateUsers
<
ActiveRecord::Migration
def
up
create_table
:users
do
|t|
t.string
:email
t.string
:password
t.timestamps
end
end
def
down
drop_table
:users run:
rake
db:migrate
end db/migrate/{timestamp}_create_users.rb
end
18. Web Services
def videos = Action { implicit request =>
Async {
val uri = "http://gdata.youtube.com/feed.xml"
WS.url(uri).get().map { response =>
Ok(views.html.videos(response.xml "entry"))
}
}
}
class
VideosController
<
ApplicationController
def
index
uri
=
"http://gdata.youtube.com/feed.xml"
video_feed
=
RestClient.get(uri)
@videos
=
Hash.from_xml(video_feed)['feed']['entry']
end
end
19. XML
Ok(views.html.videos(response.xml "entry"))
@(videos: scala.xml.NodeSeq)
@videos.map { video =>
<a href="@{ ((video "group") "player")(0).attribute("url")}">
@{(video "title")(0).text}
</a>
}
@videos
=
Hash.from_xml(video_feed)['feed']['entry']
<%
@videos.each
do
|video|
%>
<a
href="<%=
video['group']['player']['url']
%>">
<%=
video['title']
%>
</a>
<%
end
%>
20. WS.url("https://graph.facebook.com/daniella.alcarpe/albums").get().map
{
response
=>
val
albuns
=
(response.json
"data").
as[List[JsObject]].filter(album
=>
(album
"description").toString.equals(""*""))
val
photos
=
albuns.map
{
album
=>
WS.url("https://graph.facebook.com/"
+
(album
"id").toString.replace(""",
"")
+
"/photos").get().map
{
response2
=>
(response2.json
"data").as[List[JsObject]].map
{
photo
=>
((photo
"images")(3)
"source").toString.replace(""",
"")
}
}
}
Ok(views.html.photos(photos))
JSON
}
@albuns_photos
=
{}
@albuns
=
[]
albuns
=
JSON.parse(RestClient.get("https://graph.facebook.com/
daniella.alcarpe/albums"))["data"]
albuns.each
do
|album|
if
(album['description']
==
"*")
photos
=
JSON.parse(RestClient.get("https://graph.facebook.com/
#{album['id']}/photos"))["data"]
albuns_photos
=
photos.map
{|p|
p["images"][3]["source"]}
album['photos']
=
albuns_photos
@albuns
<<
album
end
end
22. Unit Tests
@Test def myTest() {
val array = List(1, 2, 3)
assert(array(0) === 1)
}
test
"my
test"
do
array
=
[1,
2,
3]
assert_equal
1,
array.first
end
23. Specs
class HelloWorldSpec extends Specification {
"The 'Hello world' string" should {
"contain 11 characters" in {
specs2
"Hello world" must have size(11)
}
"end with 'world'" in {
"Hello world" must endWith("world")
autotest:
}
}
$ ~ test
}
describe
"HelloWorldSpec"
do
context
"The
'Hello
world'
string
should"
do
it
"contain 11 characters"
do rspec
"Hello
world".size.should
eq(11)
end
it
"end with 'world'"
do
"Hello
world".should
end_with("world") $ autospec
end
end
end
27. Types
Static: Dynamic:
val a = new a
=
Hash.new
HashMap[Int, String] a
=
“BOO!”
28. Pattern Matching
require
'case'
def
matchTest
x
case
x
when
7
def myMatch(x: Any): Any =
"seven"
x match {
when
"string"
case 7 => “seven”
0
case “string” => 0
when
Case::All[Integer]
case y:Int => “no.”
case 2 :: tail => tail
"no."
}
when
Case::Array[2,Case::Any]
x[1..-‐1]
end
end
29. Monkey Patch
class MySuperString(original: String) {
def myMethod = "yess!!!"
}
implicit def string2super(x: String) =
new MySuperString(x)
println("a".myMethod) // => yess!!!
class
String
def
my_method
"yess!!!"
end
end
puts
"a".my_method
#
=>
yess!!!
30. Dynamic Calls
class Animal extends Dynamic {
def _select_(name: String) = println("Animal says " + name)
def _invoke_(name: String, args: Any*) = {
println("Animal wants to " + name + args.mkString(", "))
this
} val animal = new Animal
} animal.qualk // => Animal says qualk
animal.say("hello") // => Animal wants to say hello
class
Animal
def
method_missing
name,
*args
if
args.empty?
puts
"Animal
says
"
+
name.to_s
else
puts
"Animal
wants
to
"
+
name.to_s
+
args.join(",
")
end
self animal
=
Animal.new
end animal.qualk
#
=>
Animal
says
:
qualks
!
end animal.say("hello")
#
=>
Animal
wants
to
say
hello
31. Modules / Traits
trait PimpMyClass {
def myMethod = println("myMethod")
}
class IncludeTrait extends PimpMyClass
(new IncludeTrait).myMethod
module
PimpMyClass
def
my_method
puts
"my_method"
end
end
class
IncludeModule
include
PimpMyClass
end
IncludeModule.new.my_method
32. Duck Typing
class Duck { def ActAsADuck(a: { def quack; def walk })= {
def quack = ... a.quack
def walk = ... a.walk
}
}
class Platypus { val duck = new Duck
def quack = ... val platypus = new Platypus
def walk = ... ActAsADuck(duck)
} ActAsADuck(platypus)
class
Duck def
act_as_a_duck
animal
def
quack;
end
animal.quack
def
walk;
end
animal.walk
end end
class
Platypus duck
=
Duck.new
def
quack;
end platypus
=
Platypus.new
def
walk;
end act_as_a_duck(duck)
end act_as_a_duck(platypus)