Creating the Route Handler
The handler for the article page, getArticle
performs the following tasks:
1. Extracts the ID of the article to display
To fetch and display the right article, we first need to extract its ID from the context. This can be extracted as follows:
c.Param("article_id")
where c
is the Gin Context which is a parameter to any route handler when using Gin.
2. Fetches the article
This can be done using the getArticleByID()
function defined in the models.article.go
file:
article, err := getArticleByID(articleID)
The getArticleByID
function (in models.article.go
) is as follows:
func getArticleByID(id int) (*article, error) {
for _, a := range articleList {
if a.ID == id {
return &a, nil
}
}
return nil, errors.New("Article not found")
}
This function loops through the article list and returns the article whose ID matches the ID passed in. If no matching article is found it returns an error indicating the same.
3. Renders the article.html template passing it the article
This can be done using the code below:
c.HTML(
// Set the HTTP status to 200 (OK)
http.StatusOK,
// Use the article.html template
"article.html",
// Pass the data that the page uses
gin.H{
"title": article.Title,
"payload": article,
},
)
The updated handlers.article.go
file should contain the following code:
// handlers.article.go
package main
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
)
func showIndexPage(c *gin.Context) {
articles := getAllArticles()
// Call the HTML method of the Context to render a template
c.HTML(
// Set the HTTP status to 200 (OK)
http.StatusOK,
// Use the index.html template
"index.html",
// Pass the data that the page uses
gin.H{
"title": "Home Page",
"payload": articles,
},
)
}
func getArticle(c *gin.Context) {
// Check if the article ID is valid
if articleID, err := strconv.Atoi(c.Param("article_id")); err == nil {
// Check if the article exists
if article, err := getArticleByID(articleID); err == nil {
// Call the HTML method of the Context to render a template
c.HTML(
// Set the HTTP status to 200 (OK)
http.StatusOK,
// Use the index.html template
"article.html",
// Pass the data that the page uses
gin.H{
"title": article.Title,
"payload": article,
},
)
} else {
// If the article is not found, abort with an error
c.AbortWithError(http.StatusNotFound, err)
}
} else {
// If an invalid article ID is specified in the URL, abort with an error
c.AbortWithStatus(http.StatusNotFound)
}
}
If you now build and run your application and visit http://localhost:8080/article/view/1
in a browser, it should look like this:
The new files added in this section are as follows:
└── templates
└── article.html