gpt4 book ai didi

Grails-ish 用不同网络上的电子邮件为用户建模的方法

转载 作者:行者123 更新时间:2023-12-02 15:28:14 28 4
gpt4 key购买 nike

我拥有的是一组用户和一组网络,这些用户需要在各种网络上拥有不同的电子邮件地址——有些是内部的,有些是外部的,有些是开发的,而且他们都有自己的命名& 寻址方案。

到目前为止,我所拥有的是简化的,删除了无关代码:

class Network {

String name

static hasMany = [email: Email]

}

class User {

String login

static hasMany = [email: Email]

}

class Email {

string address

static belongsTo = [user: User, network: Network]

}

我有点挣扎,假设这是构建这种关系的正确方法,是如何处理给定用户和网络的电子邮件地址。例如,在用户创建页面中:
<g:each
in="${com.damascusgrp.dto.Network.findAll()}">
<div class="fieldcontain ${hasErrors(bean: userInstance, field: 'email', 'error')} required">
<label for="email">
${it.name}
<span class="required-indicator">*</span>
</label>
<g:field type="email" name="email" required="" value="${userInstance?.email}"/>
</div>
</g:each>

但是,虽然我确定“值(value)”是不正确的,但我就是无法理解它应该是什么。称它为 Java 会阻止我在 Groovy 中正确思考。

或者有没有一种我完全错过的更完美的方式来做到这一点?我正在将此代码从作为 User 类的一部分的单个电子邮件地址升级到此代码,虽然我考虑制作一个存在于 User 中的 HashMap,但我想先尝试一下。

- - -更新 - - -

我创建了一个只有上面列出的三个类的空项目,并让 Grails 为它们构建 Controller 和 View ,以查看它会做什么。我从中修改的内容如下所示:
<ul class="one-to-many">
<g:each in="${userInstance?.email?}" var="e">
<li><g:link controller="email" action="show" id="${e.id}">${e?.encodeAsHTML()}</g:link></li>
</g:each>
<li class="add">
<g:link controller="email" action="create" params="['user.id': userInstance?.id]">${message(code: 'default.add.label', args: [message(code: 'email.label', default: 'Email')])}</g:link>
</li>
</ul>

我基本上是从脚手架 View 中逐字逐句提取的,并将其折叠到我的代码中。我现在需要弄清楚如何从电子邮件创建页面“隐藏”用户字段,或者更好的是使用 JQuery 或类似的东西在一个页面上完成这一切。或者按照建议切换到 map 。

------第二次更新-----

实例化是唯一剩下的问题。当我尝试实例化它并向其中添加新电子邮件时,我得到一个 NPE:
java.lang.NullPointerException: Cannot invoke method collectEntries() on null object
at com.damascusgrp.dto.User.getEmailsByNetwork(User.groovy:37)
at com.damascusgrp.dto.UserSpec.Fully constructed user is good(UserSpec.groovy:44)

我已经尝试了各种方法来预加载它,或者为每个定义的网络设置空白条目,但还没有任何工作正常。这是现在的代码,在 Ian 的帮助下。
class User {

String login
String password
String firstName
String lastName
String filePath
static hasMany = [requests:Request, email: Email]

static transients = ['emailsByNetwork']

def User(String l) {
login = l
}

def getName() {
"${firstName} ${lastName}"
}

String toString() {
login
}

static constraints = {
login blank:false, size:5..15, matches:/[\S]+/, unique:true
password blank:false, size:5..15, matches:/[\S]+/
firstName blank:false
lastName blank:false
filePath blank:false
}

Map getEmailsByNetwork() {
email.collectEntries { [(it.network.id), it] }
}

def addToEmail(Email em) {
email[em.network.id] = em
}

}

最佳答案

您的示例 GSP 表明域模型具有每个 User正好有一个 Email在每个 Network - 一个 User不能有两个不同的 Email相同的对象Network .所以我会在 User 中添加一个 transient 属性。领域类

class User {

String login

static hasMany = [email: Email]

Map getEmailsByNetwork() {
(email?.collectEntries { [it.network.id, it] }) ?: [:]
}

static transients = ['emailsByNetwork']

}

现在 user.emailsByNetwork将是来自 Network 的 map 编号为 Email , 在普惠制中你可以说
<g:set var="emailsByNet" value="${userInstance.emailsByNetwork}" />
<g:each var="net"
in="${com.damascusgrp.dto.Network.findAll()}">
<div class="fieldcontain ${hasErrors(bean: emailsByNet[net.id], field: 'email', 'error')} required">
<label for="net_${net.id}_email">
${net.name}
<span class="required-indicator">*</span>
</label>
<g:field type="email" name="net_${net.id}_email" required="" value="${emailsByNet[net.id]?.email}"/>
</div>
</g:each>

在接收此表单帖子的 Controller 中,您必须处理各种 params.net_1_email等适本地更新现有的 emailsByNetwork[n]如果存在或 userInstance.addToEmail(new Email(network:Network.load(n), email:value))如果不。

关于Grails-ish 用不同网络上的电子邮件为用户建模的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24385584/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com