V1.3: Overview
A view is an object that’s responsible for rendering a template.
In a full stack Hanami application, an incoming HTTP request goes through the router, it instantiates and calls an action, which sets the status code and the headers for the response. The last bit is the body, which is set by the corresponding view’s output.
A Simple View
Hanami ships a generator for actions that creates a view and a template.
$ hanami generate action web dashboard#index
insert apps/web/config/routes.rb
create spec/web/controllers/dashboard/index_spec.rb
create apps/web/controllers/dashboard/index.rb
create apps/web/views/dashboard/index.rb
create apps/web/templates/dashboard/index.html.erb
create spec/web/views/dashboard/index_spec.rb
Looking at those file names, we have an action called Web::Controllers::Dashboard::Index
(read about actions naming).
Our view has a similar name: Web::Views::Dashboard::Index
.
Let’s examine the view:
# apps/web/views/dashboard/index.rb
module Web
module Views
module Dashboard
class Index
include Web::View
end
end
end
end
Naming
That file begins with a module declaration which is similar to the action naming structure.
The only difference is that we use Views
module instead of Controllers
.
All the views are nested under it.
This module is generated at the runtime for us, when the application starts.
For a given application named Web
, views are available under Web::Views
.
This symmetry is really important at run time. After the action has finished its job, control passes to the framework which looks for the matching view.
For a given action named Web::Controllers::Home::Index
which is handling a request, Hanami will look for a corresponding Web::Views::Home::Index
view.
View Module
All the main Hanami components are mixins meant to be included. Because a Hanami Container can run multiple applications within the same Ruby process, the configurations of these different components should be kept separated.
In our example, we have a directive include Web::View
.
That means our view will behave according to the configuration of the Web
application.
For a given application named Web
, the view mixin to include is Web::View
.