質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

2491閲覧

go言語でviewを呼ぶ際のディレクトリ構造

nabex

総合スコア66

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/10/28 15:20

編集2020/10/28 15:25

Go言語のginのフレームワークを使ってMVCモデルでCRUD機能を作っているのですが、Viewで一覧表示などの画面のテンプレートを呼び出す際についての質問です。

例えばユーザー一覧の表示の場合はview/user/index.html
書籍一覧の表示の場合はview/book/index.html
のようにindex.htmlのファイル名でそれぞれuserとbookのディレクトリに分けたいです。

今の所書籍一覧を表示させるview/index.htmlの場合はテンプレートを呼び出して一覧表示させることができるのですが、ユーザー一覧表示と分けたいので、view/book/index.html配下に置いてコントローラー側からindex.htmlを呼び出したい場合どのように書いたら良いのでしょうか。

一覧表示させるデータはDBから取得出来ている前提です。

単純にBookListメソッドを以下のようにパスを指定するだけではだめでした。

go

1c.HTML(200, "/book/index.html", gin.H{"books": BookLists})

go

1package controllers 2 3import ( 4 "errors" 5 "fmt" 6 "gin_sample/model" 7 "gin_sample/service" 8 "html/template" 9 "log" 10 "net/http" 11 "strconv" 12 13 "github.com/gin-gonic/gin" 14 _ "github.com/go-sql-driver/mysql" 15 "github.com/go-xorm/xorm" 16) 17 18// DbEngine DB 19var DbEngine *xorm.Engine 20var tpl *template.Template 21 22//Book 書籍情報一覧 23type Book struct { 24 ID int `xorm:"pk autoincr int" form:"id" json:"id"` 25 Title string `json:"title"        xorm:"'title'"` 26 Author string `json:"author"        xorm:"'author'"` 27 Content string `json:"content"        xorm:"'content'"` 28} 29 30//BookList 全件 31func BookList(c *gin.Context) { 32 bookService := service.BookService{} 33 BookLists := bookService.GetBookList() 34 c.HTML(200, "index.html", gin.H{"books": BookLists}) 35} 36 37

html

1 2<html> 3<h1>記事一覧</h1> 4<a href="new">新規作成</a><br> 5<table> 6<tr> 7 <th>ID</th> 8 <th>タイトル</th> 9 <th>著者名</th> 10 <th>内容</th> 11</tr> 12{{ range .books }} 13<form action="/book/edit/{{.ID}}" method="get"> 14 <input type="hidden" name="id" value="{{ .ID }}" /> 15 <tr> 16 <td>{{ .ID }}</td> 17 <td>{{ .Title }}</td> 18 <td>{{ .Author }}</td> 19 <td>{{ .Content }}</td> 20 <td><input type="submit" value="更新" /></td> 21 <td><a href="/book/delete/{{.ID}}">削除</a></td> 22 </tr> 23</form> 24{{end}} 25</table> 26</html>

go

1package router 2 3import ( 4 "gin_sample/controllers" 5 "net/http" 6 "github.com/gin-gonic/gin" 7) 8 9//GetRouter ルートを定義 10func GetRouter() *gin.Engine { 11 router := gin.Default() 12 router.LoadHTMLGlob("template/*.html") 13 book := router.Group("/book") 14 { 15 book.GET("/list", controllers.BookList) 16 book.GET("/new", func(c *gin.Context) { 17 c.HTML(200, "new.html", gin.H{}) 18 }) 19 book.POST("/add", controllers.BookAdd) 20 book.GET("/edit/:id", controllers.BookEdit) 21 book.POST("/update/:id", controllers.BookUpdate) 22 book.GET("/delete/:id", controllers.BookDelete) 23 } 24 25 return router 26}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

冗長ですが、ルーティングごとにテンプレートのフォルダを指定したらindex.htmlなどの同名のファイルでもディレクトリごとに分けて呼び出すことが出来ました。

//ユーザー情報 user := router.Group("/user") user.Use(controllers.SessionCheck()) { user.GET("/list", func(c *gin.Context) { router.LoadHTMLGlob("template/user/*.html") controllers.UserList(c) }) user.GET("/new", func(c *gin.Context) { router.LoadHTMLGlob("template/user/*.html") c.HTML(200, "new.html", gin.H{}) }) } //書籍情報 book:= router.Group("/book") book.Use(controllers.SessionCheck()) { book.GET("/list", func(c *gin.Context) { router.LoadHTMLGlob("template/book/*.html") controllers.BookList(c) }) book.GET("/new", func(c *gin.Context) { router.LoadHTMLGlob("template/book/*.html") c.HTML(200, "new.html", gin.H{}) })

ちなみにgojiというフレームワークでは以下のようにパスを指定するだけで出来ました。
ginのフレームワークでももっとシンプルに出来るやり方などありましたら教えていただけると幸いです。

//userNew 登録画面 func userNew(c web.C, w http.ResponseWriter, r *http.Request) { tpl = template.Must(template.ParseFiles("view/user/new.html")) tpl.Execute(w, FormData{models.User{}, ""}) }

投稿2020/11/10 16:44

nabex

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問