草庐IT

data-binding - 将结构传递给 Post martini 例程

coder 2024-07-10 原文

我在使用这个语句时遇到问题

  m.Post(Model, binding.Form(Wish), func(wish Wish, r render.Render, db *mgo.Database) {

如果我在 prog 中使用 struct define 就可以正常工作

  m.Post(Model, binding.Form(Wish1{}) , func(wish Wish1, r render.Render, db     *mgo.Database) {

但我需要它是一个独立的包。 我得到“Wish is not a type”希望是绑定(bind)函数的返回。 这适用于主要类型结构。我将支柱作为接口(interface)传递{}

我正在使用带有 Martini.Classic() 的 GO 更改 Martini 或 Binding 包对我来说真的很复杂。任何建议。

这是全部代码

package chlistpkg
import (
  "github.com/codegangsta/martini"
  "github.com/codegangsta/martini-contrib/binding"
  "github.com/codegangsta/martini-contrib/render"
  "labix.org/v2/mgo"
  "time"
  "fmt"
  "html/template"
  "reflect"
  "adminStruct"
)

只是为了显示我需要传递给例程 Doall 的结构

type Wish1 struct {
  Name        string `form:"name"`
  Description string `form:"description"`
  AnyDate     time.Time  `form:"anydate"`
  Active      bool   `form:"active"`
  Number      int    `form:"number"`
  NumDec      float32  `form:"numDec"`
 }

DB 返回一个 martini.Handler

 func DB() martini.Handler {
    session, err := mgo.Dial("mongodb://localhost")
    if err != nil {
      panic(err)
     }

 return func(c martini.Context) {
    s := session.Clone()
    c.Map(s.DB("advent2"))
    defer s.Close()
    c.Next()
}

GetAll 返回数据库中的所有 Wishes

 func GetAll(db *mgo.Database, entList interface{}) interface{} {
   db.C("wishes").Find(nil).All(entList)
   fmt.Println("GettAll entList =", entList)
   return entList
 }


   func Doall(Model string, Wish interface{}, Wish2 interface{}, Wishlist interface{}         ) {
     m := martini.Classic()
     fmt.Println ("martini.Classic =", m)
     m.Use(martini.Static("images")) // serve from the "images" directory as well

     m.Use(render.Renderer(render.Options{
        Directory: "templates",
        Layout: "layout",
      }))

   m.Use(DB())

   m.Get(Model, func(r render.Render, db *mgo.Database) {
     r.HTML(200, "lista4", GetAll(db,  Wishlist))
   })

绑定(bind)不采用指针。我必须在“Wish”上通过引用传递结构 问题是“wish Wish”的返回我得到一个错误 Wish is not a type 在编译时

m.Post(Model, binding.Form(Wish), func(wish Wish, r render.Render, db *mgo.Database) {
fmt.Println("Input wish =", wish)
db.C("wishes").Insert(wish)
r.HTML(200, "lista4", GetAll(db, Wishlist))
})

m.Run()

提前致谢

路易斯

最佳答案

您收到错误的原因是您调用了您的类型 Wish1(带有数字 1),但您指的是 Wish 类型(它没有存在!)在你的代码中。

将您的结构更改为:

// Note: "Wish", not "Wish1"
type Wish struct {
  Name        string `form:"name"`
  Description string `form:"description"`
  AnyDate     time.Time  `form:"anydate"`
  Active      bool   `form:"active"`
  Number      int    `form:"number"`
  NumDec      float32  `form:"numDec"`
}

如果你想把你的类型放到另一个包中(提示:不要过度使用子包),那么它需要成为一个 pkgname.Wish 因为名称是完全限定的。

已添加

再看一眼,你也把事情搞砸了:

 func Doall(Model string, Wish interface{}, Wish2 interface{}, Wishlist interface{}         ) {
     m := martini.Classic()
     fmt.Println ("martini.Classic =", m)
     m.Use(martini.Static("images")) // serve from the "images" directory as well

您的参数列表需要为每个类型提供一个名称;您不能将 Wish 接口(interface){} 作为参数传递,因为 Wish 是一种类型,而不是变量名。

你应该:

func DoAll(model string, wish interface{}, wish2 interface{}, wishList interface{}) { ... }

或者,更好的是,停止像这样使用 interface{} 并编写:

func DoAll(model string, wishList []Wish, wishes... Wish) { ... }

但是,您的 DoAll 函数似乎没有在其他地方被引用,并且正在创建自己的 Martini 实例。如果您刚开始,我强烈建议考虑一下为什么事情会像这样“分开”。保持简单 - 例如

func main() {
    m := martini.Classic()
    m.Use(martini.Static("images"))
    m.Use(DB())
    m.Use(render.Renderer(render.Options{...}))
    // No need for an anonymous function, which just adds clutter
    m.Get("/wishes/all", GetAllWishes)
    // Same goes for here
    m.Post("/wishes/new", PostWish)

    m.Run()
}

PS:我已经修复了您的代码的格式,因为它在括号前后有很多不必要的空格。确保使用 gofmt,它包含在 Go 安装中,可以连接到大多数流行的编辑器。

关于data-binding - 将结构传递给 Post martini 例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685338/

有关data-binding - 将结构传递给 Post martini 例程的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  3. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  4. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  8. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  9. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  10. ruby - 如何将 Puma::Configuration 传递给 Sinatra? - 2

    这是我的网络应用:classFront我是这样开始的(请不要建议使用Rack):Front.start!这是我的Puma配置对象,我不知道如何传递给它:require'puma/configuration'Puma::Configuration.new({log_requests:true,debug:true})说真的,怎么样? 最佳答案 配置与您运行的方式紧密相关puma服务器。运行的标准方式puma-pumaCLI命令。为了配置puma配置文件config/puma.rb或config/puma/.rb应该提供(参见examp

随机推荐