我确信这必须是编程中最常见的事情之一,那就是如何将某个表单提交与某个登录用户相关联。

我已经尝试了很长一段时间,但最终还是绕圈运行,一次又一次出错。

我的问题是,让用户拥有他们提交的记录的正确方法是什么?

我尝试了很多选择,均未成功。 :\我什至尝试了创建String字段并将当前用户插入gsp的隐藏字段中的不太安全的方法,甚至无法正常工作。

静态归属于=用户

在domain类中,很棒,但这只能让我在User表单中看到它。

也许问题在于它如何搭棚。生成 Controller ,生成 View 为所有记录做了一个很好的通用列表。我需要此列表仅显示其记录。但除此之外,我还需要管理员才能查看所有记录。

谁能帮助我指出正确的方向?

SalesOrderController.groovy

@Secured(['IS_AUTHENTICATED_REMEMBERED']) 
def list(Integer max) {      
 
    params.max = Math.min(params.max ? params.max.toInteger() : 10, 100) 
    [salesOrderInstanceList: SalesOrder.list(params), salesOrderInstanceTotal: SalesOrder.count()] 
//      def user = params.id ? SecUser.findByUsername(params.id) : SecUser.get(springSecurityService.principal.id) 
//      [salesOrderInstanceList: SalesOrder.findAllBySoldBy(user), salesOrderInstanceTotal: SalesOrder.count()] 
//      if (!user) { 
//          response.sendError(404) 
//          return 
//      } 
} 

SalesOrder类{
static searchable = { 
    user(component:true) 
} 
 
enum JobStatus { 
    PENDING, APPROVED, COMPLETE 
} 
 
enum JobType { 
    INSTALL, REPAIR, WARRANTY, TINT 
} 
 
enum PaymentType { 
    INSURANCE, CASH 
} 
 
enum InstallLocation { 
    INSHOP, HOME, BUSINESS 
} 
 
enum InstallTime { 
    MORNING, MIDDAY, AFTERNOON 
} 
 
JobStatus jobStatus 
JobType jobType 
PaymentType paymentType 
 
String custFirstName 
String custLastName 
String custBestNumber 
String custAlternateNumber 
String custEmail 
String custAddress 
String custAddress2 
String custCity 
String custState 
String custZip 
 
String vehicleYear 
String vehicleMake 
String vehicleModel 
String vehicleVin 
 
static hasMany = [glassTypes: GlassType, options: GlassOption] 
 
Date insuranceDateOfLoss 
String insuranceCompany 
String insurancePolicyNumber 
String insuranceClaimNumber 
String insuranceDeductible 
 
Date installDate 
InstallTime installTime 
InstallLocation installLocation 
String installCrossStreet1 
String installCrossStreet2 
String installAddress 
String installCity 
 
String notes 
 
Date dateCreated 
String soldBy 
 
 
static constraints = { 
 
    jobType blank: false 
    custFirstName blank: false 
    custLastName blank: false 
    custBestNumber blank: false, size:10..10 
    custAlternateNumber nullable: true, sizeMax: 10 
    custEmail blank: false, email: true 
    custAddress blank: false 
    custAddress2 nullable: true 
    custCity blank: false 
    custState blank: false, size: 2..2 
    custZip blank:false, size: 5..5 
 
    vehicleYear blank: false, size:4..4 
    vehicleMake blank: false 
    vehicleModel blank: false 
    vehicleVin blank: false, size:17..17 
 
    glassTypes blank: false 
    options blank: false 
 
    insuranceDateOfLoss nullable: true 
    insuranceCompany nullable: true 
    insurancePolicyNumber nullable: true 
    insuranceClaimNumber nullable: true 
    insuranceDeductible nullable: true 
 
    installDate blank: false 
    installTime blank: false 
    installLocation blank: false 
    installCrossStreet1 blank: false 
    installCrossStreet2 blank: false 
    installAddress nullable: true 
    installCity nullable: true 
 
    paymentType blank: false 
    jobStatus blank: false 
    notes nullable: true, size:0..1024 
    soldBy blank: false      
} 
 
static belongsTo = SecUser 

}
<div class="fieldcontain ${hasErrors(bean: salesOrderInstance, field: 'soldBy', 'error')} required"> 
<label for="soldBy"> 
    <g:message code="salesOrder.soldBy.label" default="Sold By" /> 
</label> 
<g:textField name="soldBy" value="${salesOrderInstance?.soldBy}" default="${sec.loggedInUserInfo(field:'username')}" /> 
<sec:loggedInUserInfo field="username"></sec:loggedInUserInfo> 

我尝试跟随一个使用服务的示例,但是这让我迷失了方向,因为该示例仅需要传递一个字段。如您所见,我有不止一个,还有许多一对一的连接。给我的问题多于答案。

请您参考如下方法:

关于用户看到自己的数据与管理员看到每个人的数据see my answer to a similar question here的问题。

至于将用户与其自己的数据相关联...如果数据应属于用户,则只需将User域与所述数据相关联即可,就像您已经做过的一样,只是稍作修改:

class SalesOrder { 
 
   static belongsTo = [secUser : SecUser] 
 
} 

然后将适当的映射添加到您的SecUser类:
class SecUser { 
 
   static hasMany = [salesOrders : SalesOrder] 
 
} 

然后,当您将数据发布到服务器时:
@Secured(['IS_AUTHENTICATED_REMEMBERED']) 
def save() { 
 
   def authenticatedUser = SecUser.findByUsername(springSecurityService.principal.username) 
   def salesOrder = new SalesOrder(params) 
   // this assumes you're SecUser and SalesOrder are a 1-to-many bidirectional association 
   authenticatedUser.addToSalesOrders(salesOrder) 
   authenticatedUser.save() 
} 

由于 Controller 中可以使用相同的数据,因此无需将信息存储在隐藏字段中。脚手架是入门概念验证的好方法。但是,我不再使用脚手架了。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!