首页 > 解决方案 > 带有“--skip-model”标志的“生成资源”命令导致资源错误

问题描述

描述

刚开始使用 Buffalo,尝试了所有漂亮的功能 :)

但是,我遇到了“生成资源”命令与“--skip-model”标志相结合的问题。使用此标志时,所有生成的函数(“List”、“Show”、“Create”、“Update”和“Destroy”)都完全以小写形式创建。然而,同样生成的结构引用“buffalo.Resource”并包含这些函数,其中第一个字母为大写,导致资源不起作用。

重现问题的步骤

  1. 使用带有“--skip-model”标志的生成资源命令:buffalo g r todo --skip-model
  2. 使用以下命令运行应用程序:buffalo dev.
  3. 导航到“http://127.0.0.1:3000/todoes”;验证您是否收到错误消息“运行时错误:无效的内存地址或 nil 指针取消引用”。
  4. 在生成的文件中验证“todoes.go”是否包含完全小写的生成函数(“List”、“Show”、“Create”、“Update”和“Destroy”),而生成的名为“TodoesResource”的结构是指“buffalo.Resource”并包含这些函数,其中第一个字母为大写。

预期行为

我希望生成的函数的第一个字母为大写,与“buffalo.Resource”中的名称匹配,并在导航到“http://127.0.0.1:3000/todoes”时产生响应“Todo#list”(之后启动应用程序)。当你不使用“--skip-model”标志时就是这种情况,所以我不确定为什么当你使用这个标志时它的行为会有所不同。

实际行为

生成的函数(“List”、“Show”、“Create”、“Update”和“Destroy”)完全小写,而生成的名为“TodoesResource”的结构指的是“buffalo.Resource”并包含这些函数第一个字母大写。当导航到“http://127.0.0.1:3000/todoes”(启动应用程序后)时,这会导致错误“运行时错误:无效的内存地址或 nil 指针取消引用”。

建议的解决方案

我无法创建拉取请求(因为我在尝试发布分支时收到错误“gobuffalo/buffalo.git 的权限被拒绝”),但我认为这个问题有两种可能的解决方案:

首选解决方案

修改文件“genny/resource/templates/standard/action/resource-name.go.tmpl”以更改以下代码:

// {{$a.String}} default implementation.
func (v {{$.opts.Name.Resource}}Resource) {{$a.String}}(c buffalo.Context) error {
  return c.Render(http.StatusOK, r.String("{{$.opts.Model.Proper}}#{{$a.String}}"))
}

并将其更改为:

// {{$a.Pascalize}} default implementation.
func (v {{$.opts.Name.Resource}}Resource) {{$a.Pascalize}}(c buffalo.Context) error {
  return c.Render(http.StatusOK, r.String("{{$.opts.Model.Proper}}#{{$a.Pascalize}}"))
}

替代解决方案

修改文件“genny/resource/actions.go”以更改以下代码:

func actions(opts *Options) []name.Ident {
    actions := []name.Ident{
        name.New("list"),
        name.New("show"),
        name.New("create"),
        name.New("update"),
        name.New("destroy"),
    }
    if opts.App.AsWeb {
        actions = append(actions, name.New("new"), name.New("edit"))
    }
    return actions
}

并将其更改为:

func actions(opts *Options) []name.Ident {
    actions := []name.Ident{
        name.New("List"),
        name.New("Show"),
        name.New("Create"),
        name.New("Update"),
        name.New("Destroy"),
    }
    if opts.App.AsWeb {
        actions = append(actions, name.New("New"), name.New("Edit"))
    }
    return actions
}

标签: gobuffalo

解决方案


这是一个错误,目前正在修复中。另见:https ://github.com/gobuffalo/buffalo/issues/2023 。


推荐阅读