描述
刚开始使用 Buffalo,尝试了所有漂亮的功能 :)
但是,我遇到了“生成资源”命令与“--skip-model”标志相结合的问题。使用此标志时,所有生成的函数(“List”、“Show”、“Create”、“Update”和“Destroy”)都完全以小写形式创建。然而,同样生成的结构引用“buffalo.Resource”并包含这些函数,其中第一个字母为大写,导致资源不起作用。
重现问题的步骤
- 使用带有“--skip-model”标志的生成资源命令:
buffalo g r todo --skip-model
。 - 使用以下命令运行应用程序:
buffalo dev
. - 导航到“http://127.0.0.1:3000/todoes”;验证您是否收到错误消息“运行时错误:无效的内存地址或 nil 指针取消引用”。
- 在生成的文件中验证“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
}