Я пытаюсь сохранить структуру для моей модели в сеансах гориллы с бэкэндом mySQL, но получаю 0 только для venueID, когда пытаюсь получить ее.У меня нет проблем с сохранением и получением флеш-сообщений.Моя цель - сохранить структуру модели в сеансе и извлечь ее, чтобы получить идентификационный номер в функциях редактирования, обновления и удаления.
Вот мой код:
type appResource struct {
tmpl *template.Template // net/http
store *mysqlstore.MySQLStore
db *sql.DB // database/sql
}
// newAppResource function to pass global var
func newAppResource(store *mysqlstore.MySQLStore, db *sql.DB, tmpl *template.Template) *appResource {
return &appResource{
store: store,
db: db,
tmpl: tmpl,
}
}
func main() {
sessionKey := os.Getenv("sessionKey")
endpoint := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true&loc=Local", dbUser, dbPass, dbHost, dbPort, dbName)
tableName := "sessions"
path := "/"
maxAge := 3600
codecs := []byte(sessionKey)
store, err := mysqlstore.NewMySQLStore(endpoint, tableName, path, maxAge, codecs)
if err != nil {
log.Println("SESSIONS STORE error")
log.Fatal(err)
....
}
}
type Venue struct {
VenueID int
Name string
Email string
Phone string
Active bool
}
// VenueData template variable for show and edit
type VenueData struct {
Venue Venue
Flashes []interface{}
}
func (rs *appResource) venuesShow(w http.ResponseWriter, r *http.Request) {
var venue Venue
var data VenueData
id := r.URL.Query().Get("id")
venueID, err := strconv.Atoi(id)
if err != nil {
log.Println("show venue ID not > 0")
http.Redirect(w, r, "/login", http.StatusUnauthorized)
return
}
if !(venueID > 0) {
log.Println("update venue ID not > 0")
http.Redirect(w, r, "/login", http.StatusUnauthorized)
return
}
query, err := rs.db.Query("SELECT id, name, email, phone, active FROM Venues WHERE id=?", venueID)
if err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
for query.Next() {
err = query.Scan(&venue.VenueID, &venue.Name, &venue.Email, &venue.Phone, &venue.Active)
if err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
data.Venue = venue
session, err := rs.store.Get(r, "admin-data")
if err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println(venue.VenueID)
if flashes := session.Flashes(); len(flashes) > 0 {
for _, message := range flashes {
data.Flashes = append(data.Flashes, message)
}
}
session.Values["venue"] = venue
session.Save(r, w)
if err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err := rs.tmpl.ExecuteTemplate(w, "venues-show", data); err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func (rs *appResource) venuesEdit(w http.ResponseWriter, r *http.Request) {
var data VenueData
session, err := rs.store.Get(r, "admin-data")
if err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
venue := getVenue(session)
venueID := venue.VenueID
query, err := rs.db.Query("SELECT id, name, email, phone, active FROM Venues WHERE id=?", venueID)
if err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
for query.Next() {
err = query.Scan(&venueID, &venue.Name, &venue.Email, &venue.Phone, &venue.Active)
if err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
data.Venue = venue
}
if err := rs.tmpl.ExecuteTemplate(w, "venues-edit", data); err != nil {
log.Fatal(err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func getVenue(s *sessions.Session) Venue {
val := s.Values["venue"]
var venue = Venue{}
venue, ok := val.(Venue)
if !ok {
log.Println("no venue found")
return Venue{}
}
return venue
}