2017-04-19 6 views
0

私は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) 
} 

しかし、私は何のidフィールドを持っていないので、それはとにかく新しいオブジェクトを作成します(InsertOrUpdateで)フォームを送信しようとしているときフォームから(IDパラムからオブジェクトをルートから取得しているため)私はとにかくIDを渡すべきですか、それをハックする方法は?

答えて

1

フォームを解析した後だけでIDを追加します。

ビーゴのソースを通じて探し
if err := c.ParseForm(&service); err != nil { 
    c.Abort("500") 
} 
service.Id = id 

を、私はあなたができる考える

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" 
} 
+0

私もそれを考えますが醜いですか?私はデータベースからオブジェクトを取得し、それにフォームデータを適用します。フォームにないIDをオーバーライドするのはなぜですか? –

+0

あなたは 'ParseForm'メソッドを表示しなければなりません、私はなぜそれが上書きされるのかわかりません – dave

+0

これは私のものではなく、beegoからです –

関連する問題