Grails的v3.3.9:如何保持脚手架的观点从静止API分开

时间:2019-02-01 12:12:16

标签: rest grails scaffolding

的grails v3.3.9

我将能够使用脚手架视图/控制器,但要与其余的API视图和控制器保持分开

我开始了我的项目的应用程序产生jsonApi所以我安装我的UrlMappings像这样的东西。

   ...
   "/api/sites"(resources:'site') {
        "/devices" (resources:'device')
    } ...

然后我在grails-app / controllers中创建了RestfulController,默认约定假定您的控制器为SiteController,然后您使用gson模板编辑grails-app / views / site进行剩余渲染。到目前为止一切都很好。

现在您要尝试使用脚手架视图-并且平台默认设置开始崩溃。

我在这样UrlMappings创建一个新的条目,向UI引导到其自己的控制器

    "/ui/sites/$action?/$id?" (controller:"siteUI") {
        constraints {
            // apply constraints here
        }
    }

然后您可以创建一个像这样的新控制器

   class SiteUIController {
       static scaffold = x.y.z.Site
   }

并运行该应用程序,并以/ ui / sites的身份在浏览器中访问-它会呈现网站列表。

但是有两个迫在眉睫的问题

1)我的站点有一个Org域引用(单个引用)(带有toString()),如果我查看生成的链接引用,它看起来像这样(内部以某种方式生成了对其余部分的引用API控制器和不将HTML控制器。)单位链接是

  http://localhost:8080/api/orgs/1

2)我的站点也有位置(站点具有许多location集合)(至今尚未在该域上定义toString)。当您查看生成的链接时,它看起来像这样。位置链接

http://localhost:8080/location/show/2 

既不是其余的也不是html控制器!

我试图作弊并保存了我的其余端点,并创建了一个generate-controller Site,并生成generate-views Site,并弄乱了将它们放在正确的目录(views / siteUI,controller / siteUI等)中并还原了我的保存的其余端点再次返回。

这已经有所帮助,因为我现在可以通过在浏览器中键入URL(例如“ / ui / sites / show / 1”)转到正确的视图,并且可以正常显示。但是它呈现的链接将无法正常工作,因为所有默认设置都是错误的。

那我该怎么办?尝试更改所有“默认”脚手架假设,查看逻辑等巨大痛苦。我不想去那里。

我首先要做所有的脚手架吗?开始工作,然后再添加其余的控制器/视图?

我不想将UI与Rest控制器混合使用,以便可以分别和独立地使用它们,并且任何UI摆弄都不会弄乱/破坏其余点,反之亦然

在我陷入混乱之前-我想要一些最佳方法的指导,以使这些内容分开而又不会破坏框架中的所有BAU平台标准/逻辑-那对我来说太难了。

在接近这种情况下最好的办法

建议将greatfully接收。我希望有人来过这里,并找到了最好的进行方法。

1 个答案:

答案 0 :(得分:0)

我想我找到了在行动中的Grails的答案 - 第二版332页

有时,约定上的约定可能会造成混淆。在UrlMappings基本上声明这样的事情时:

    "/api/sites"(resources:'site') {
        "/devices" (resources:'device')

您可能会认为资源名称是指域类,实际上是控制器类的名称:

所以,如果你的名字是这样的映射

    "/api/sites"(resources:'siteRest') {
        "/devices" (resources:'deviceRest')

它将把请求推送到siteRest控制器。

此外,不是所有控制器都位于grails-app / controllers中的同一层,而是不必要的。

基本上,如果您创建类似两个子目录的目录,例如/ rest和/ ui,并将各自的控制器放在每个目录中(例如/rest/siteRestController.groovy和/ui/siteController.groovy),则使用URL解析机制正在寻找<stem>名称在grails-app /控制器目录下匹配。因此,主要要求是控制器名称必须唯一。

默认映射,然后拾取并处理所有-generate-all / controller支架式控制器。

    "/$controller/$action?/$id?(.$format)?" {
        constraints {
            // apply constraints here
        }
    }

这使您可以将探索远离HTML探索,而不必再与框架抗争。

如果您想使用fields插件,还有其他困难-但可悲的是,必须将其保存用于其他帖子。

正文我怀疑得到匹配的相同的方式 - 我不知道 - 但我忘在Grails中,应用同一级别的所有视图/视图的时刻(如网站,siteRest文件夹并排在grails-app / views中。

现在,您可以使用generate-all x.y.x.DomainClass,然后将生成的文件移动到所需的控制器结构中。

PS我使用的IntelliJ,我曾与IDE缓存的问题和抱怨,它可以/不可以做应用“跑”时,找到的东西。基本上,如果您尝试使用Grails视图并进行“引导运行”,并且可以运行,但是您的IDE抱怨,那么您就有问题了。

如果您选择包区(服务,域等),并点击右键,找到“重建”选项一半一路下滑 - 这似乎重新在该领域的高速缓存和应用程序在IDE中开始工作的运行行动对行动再次。这似乎是由产生,所有产生的在你的域模型的变化和可能的Grails的数据业务特别敏感。进行重建操作似乎可以清除缓存,并使您恢复工作。

如果您想了解其中的一些结构,可以查看GitHub上的该项目,该项目显示了迄今为止的工作情况

Sample