Phoenix, Let's Build
Welcome to the second installment of our Phoenix walkthrough. Last time we set up Phoenix, our database and saw our default 'Welcome' page for our dummy library application.
This week we will use some more generators and create our first model, views, and controller. Since this will be a library application, the most obvious choice of our first model should be a `book`.
Generate Scaffold
# mix [generator name] [model name] [table name] [attribute name : attribute type]
mix phoenix.gen.html Book books title:string author:string description:text
# in rails we do
# rails generate scaffold Book title:string author:string description:text
There are a few key differences between the two, although they are very similar:
- mix: it's the rake/rails of the elixir world.
- phoenix.gen.html: this is the generator to use. remember that generators are just ordinary elixir scripts. also notice the `html` suffix which uses the script to generate html (as opposed to json -> phoenix.gen.json).
- Book: this is the model name. notice the upper case. all models are uppercased.
-
books: this is an interesting distinction vs the rails world. WE NAME THE TABLE OURSELVES.
in rails the name of the table is automatically made to be the pluralized name of the model, like Book (model name) -> books (table name).
but English is a quirky language and you cannot always just add `s` to the end of the word, like child to children. so there is some complication in how rails needs to figure out to pluralize you model name.
this is the first example of some bloat that Phoenix does away with, instead of trying to figure out how to pluralize your model name, Phoenix just defers to you, the developer, to name the table. - attributes: this is exactly the same as rails. except in Phoenix, if we omit the type, it defaults to `string`.
➜ phoenix_library git:(master) mix phoenix.gen.html Book books title author description:text
* creating web/controllers/book_controller.ex
* creating web/templates/book/edit.html.eex
* creating web/templates/book/form.html.eex
* creating web/templates/book/index.html.eex
* creating web/templates/book/new.html.eex
* creating web/templates/book/show.html.eex
* creating web/views/book_view.ex
* creating test/controllers/book_controller_test.exs
* creating web/models/book.ex
* creating test/models/book_test.exs
* creating priv/repo/migrations/20161014160805_create_book.exs
Add the resource to your browser scope in web/router.ex:
resources "/books", BookController
Remember to update your repository by running migrations:
$ mix ecto.migrate
Look at all the nice things that are generated. This is very similar to scaffold generation. You can see theres:
- controller: book_controller
- templates: index, show, new, edit, form
- views: book_view
- model: book
- tests: book_controller, book
- migration
scope "/", PhoenixLibrary do
pipe_through :browser # Use the default browser stack
get "/", PageController, :index
# added this line here
resources "/books", BookController
end
Next run `rake db:migrate`...I mean `mix ecto.migrate`. :)
➜ phoenix_library git:(master) ✗ mix ecto.migrate
Compiling 9 files (.ex)
Generated phoenix_library app
04:42:58.436 [info] == Running PhoenixLibrary.Repo.Migrations.CreateBook.change/0 forward
04:42:58.436 [info] create table books
04:42:58.456 [info] == Migrated in 0.0s
Now start the server and check out your changes!
➜ phoenix_library git:(master) ✗ mix phoenix.server
Compiling 8 files (.ex)
[info] Running PhoenixLibrary.Endpoint with Cowboy using http://localhost:4000
21 Oct 04:46:52 - info: compiled 6 files into 2 files, copied 3 in 2.1 sec
Don't forget to hit the new route -> http://localhost:4000/books. Alright, that's it for now. Next time we'll talk about the model and migration.
No comments:
Post a Comment