Grails render v respond - 将数据传递给控制器的约定
Posted
技术标签:
【中文标题】Grails render v respond - 将数据传递给控制器的约定【英文标题】:Grails render v respond - conventions for passing to data to the controller 【发布时间】:2017-04-11 16:05:07 【问题描述】:尽管阅读了文档,但我发现一些用于将数据从控制器传递到视图的 Grails 约定有点不透明。几个基本问题:
这里有一些问题:
1) 在为“Person”控制器创建的脚手架中,索引操作以
结尾respond Person.list(params) model:[personCount: Person.count()]
在 index.gsp 中,列表通过以下方式呈现给浏览器:
<f:table collection="$personList" />
我的问题是,这个 personList 变量是从哪里来的?或者换一种说法,控制器中 Person.list(...) 的输出是如何显示在名为 personList 的视图中的?是否有关于是否调用的通用规则
respond foo
而foo是一个列表,那么它会以“fooList”的名字出现在控制器中?
2) 如果说“render foo”就可以给控制器提供一个对象,那么模型参数的作用是什么?即
之间有什么区别吗respond foo
和
respond model:[foo: foo]
似乎两者都可以使用"$foo"
在视图中访问
3) 最后,“响应”和“渲染”之间的区别的简明描述是什么?它们似乎都将数据从控制器传递到视图。
【问题讨论】:
如果有什么安慰的话,我也觉得响应非常神秘,因为它具有内在的魔力,如果你的情况不完全符合,你真的不知道发生了什么或如何使用一个例子。例如。我想用两个对象进行响应,但我不知道如何执行此操作,因为文档说您只能将单个对象作为参数(+ 参数参数)传递。如果您需要使用参数参数来传递其他对象,或者如果您有两个对象而不是对象,这会让人感到困惑。我阅读了响应文档并决定渲染会节省大量调试时间 有趣的是,我已经在 Grails 中编写了数百个 JSON API 和数千个 UI 控制器。我几乎从未遇到过 API 控制器方法和输出与 UI 控制器方法之间存在重叠的情况,因此在我的情况下,响应无济于事。 【参考方案1】:因此,文档很好地解释了respond 和render,并指出了两者之间的区别。特别是您提出的问题。
不过,我还是会在这里回答他们:
-
使用
respond
时,它将尝试根据类型确定适当的模型变量名称。因此,对于您的示例,由于Person.list()
返回List
,模型变量变为personList
,在您的另一个示例中,如果foo
是List
,它确实变为fooList
。这在有关 respond 的文档中进行了解释(带有具体示例)。
respond
和 render
的不同之处在于 respond
尝试使用基于 accept
标头(或文件扩展名)的最合适的模型进行回复。 render
允许您更具体地控制以呈现响应,而不管 accept
标头(或文件扩展名)如何。这在文档中对两者的描述中也很清楚。
差异的简明描述可在respond
和render
的描述中找到(来自文档):
响应:尝试返回最合适的类型 请求的内容类型(由 Accept 标头或文件指定 扩展名)
和
渲染:从简单的文本中渲染不同形式的响应 响应,查看和模板。
简单地说:“当您想要支持多种类型的响应类型并遵循 Grails 约定时使用respond
,当您想要更具体地控制响应类型时使用render
。
【讨论】:
谢谢约书亚。我看到的页面是 Google 搜索“Grails 响应”返回的页面,该页面链接到 3.1.1 版的文档,该文档非常粗略。新页面有了很大改进。【参考方案2】:我的问题是,这个 personList 变量是从哪里来的?
respond
方法是将Person
的列表添加到模型中,默认情况下会从Person
类名生成模型变量名。
【讨论】:
以上是关于Grails render v respond - 将数据传递给控制器的约定的主要内容,如果未能解决你的问题,请参考以下文章