Как правильно обрабатывать отправку формы в beego?
Я пытаюсь отправить данные формы в beego и сохранить их в базе данных. И есть несколько вопросов:
- Как правильно обработать запрос и преобразовать его в объект?
- Должен ли я проверить запрос или преобразованный объект?
Мой контроллер действия:
func (c *ServicesController) Edit() {
var err error
var id, _ = c.GetUint64(":id")
var serviceModel = models.Service{}
var service models.Service
service, err = serviceModel.FindById(id)
c.Data["Service"] = service
if err == orm.ErrNoRows || err == orm.ErrMissPK {
c.Abort("404")
}
if c.Ctx.Input.IsPost() {
err = nil
if err := c.ParseForm(&service); err != nil {
c.Abort("500")
}
serviceModel.CreateOrUpdate(service)
}
c.TplName = "services/edit.html"
}
Модель:
type Service struct {
Id uint64 `form:"-"`
Name string `orm:"size(100)" valid:"Required; MaxSize(100)" form:"name"`
}
func init() {
orm.RegisterModel(new(Service))
}
func (s *Service) FindById(id uint64) (Service, error) {
o := orm.NewOrm()
service := Service{Id: id}
err := o.Read(&service)
return service, err
}
func (s *Service) CreateOrUpdate(service Service) {
o := orm.NewOrm()
o.InsertOrUpdate(&service)
}
Но когда я пытаюсь отправить форму (с InsertOrUpdate
) он в любом случае создает новый объект, потому что у меня нет поля id в форме (потому что я извлекаю объект из id param из маршрута). Должен ли я передать идентификатор для создания в любом случае или как взломать его?
1 ответ
Решение
Просто добавьте идентификатор после разбора формы:
if err := c.ParseForm(&service); err != nil {
c.Abort("500")
}
service.Id = id
Просматривая источник Beego, я думаю, что вы могли бы сделать:
if c.Ctx.Input.IsPost() {
c.Input().Add("id", id)
err = nil
if err := c.ParseForm(&service); err != nil {
c.Abort("500")
}
serviceModel.CreateOrUpdate(service)
}
Но если нет, я бы просто немного реструктурировал ваш код:
func (c *ServicesController) Edit() {
var id, _ = c.GetUint64(":id")
var service models.Service{}
var serviceModel = models.Service{}
var err error
if c.Ctx.Input.IsPost() {
if err = c.ParseForm(&service); err != nil {
c.Abort("500")
}
service.Id = id
serviceModel.CreateOrUpdate(service)
} else {
service, err = serviceModel.FindById(id)
if err == orm.ErrNoRows || err == orm.ErrMissPK {
c.Abort("404")
}
c.Data["Service"] = service
c.TplName = "services/edit.html"
}