如何在将数据传递给grails中的删除操作之前格式化数据?

时间:2015-08-11 06:52:19

标签: grails

我正在尝试创建一个简单的应用程序,以便我熟悉grails。 应用程序的功能是利润和日期的CRUD。我用日期作为主键。

我完成了添加和阅读,现在我正在处理删除部分。

这是示例数据库

> ---------------------------- 
>|   date       |   profit  |
> ---------------------------- 
>| 2015-08-01   |  4.45678  | 
>| 2015-08-02   |  76.45678 |
>| 2015-08-03   |  567      | 
>| 2015-08-04   |  6789.60  |
> ----------------------------

这是错误消息:

  

URI /SampleGrailsApp/dailyProfit/delete/2015-08-10%2000:00:00.0类   org.hibernate.TypeMismatchException消息提供的错误ID   class samplegrailsapp.DailyProfit的类型。预期:上课   java.util.Date,得到类java.lang.Long

这是控制器

package samplegrailsapp

import java.text.DateFormat
import java.text.SimpleDateFormat

class DailyProfitController {
    def scaffold = DailyProfit
    def index() { 
        list()
    }

    def save() {
       // Date myDate = params.date('test', 'yyyy-MM-dd');
        params.date_month = (Integer.parseInt(params.date_month)<10)? "0" + params.date_month : params.date_month
        params.date_day = (Integer.parseInt(params.date_day)<10)? "0" + params.date_day : params.date_day
        params.date = params.date_year + "-" + params.date_month + "-" + params.date_day
        def dailyProfit = new DailyProfit(params)
        println params.toString()
        dailyProfit.save()
        list()
        //render(view:"profitTable")

    }

    def list(){
        def dailyProfit = DailyProfit.list()
        render view:"profitTable",  model: [dailyProfit : dailyProfit]
    }


    def delete(Date date){
        def dailyProfit = DailyProfit.get(date)
        dailyProfit.delete(flush: true)
        list()
    }
}

HTML文件

<table class="table table-hover table-bordered">
<thead>
<tr>
<th>Date</th>
<th>Profit</th>
<th>Delete?</th>
</tr>
</thead>
<tbody> 
<g:each in="${dailyProfit}" var="dp">
<tr>
<td><g:formatDate format="yyyy-MM-dd" date="${dp.date}"/></td>
<td>
<g:formatNumber number="${dp.profit}" type="currency" currencyCode="PHP" format="###.##" />
</td>
<td>
<g:form controller="dailyProfit" action="delete" id="${dp.date}">
<g:actionSubmit value="Delete" >
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
</g:actionSubmit>    
</g:form>
</td>
</tr>
</g:each>
</tbody>
</table>

这是DailyProfit.groovy

package samplegrailsapp

import java.text.DateFormat
import java.text.SimpleDateFormat
import org.grails.databinding.BindingFormat
class DailyProfit {
    @BindingFormat('yyyy-MM-dd')
    Date date;
    double profit; 

    static constraints = {
        date (blank:false, nullable:false, validator: {value, object ->
           DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
           Calendar cal  = Calendar.getInstance();
           cal.setTime(new Date());
           cal.set(Calendar.HOUR_OF_DAY, 0);
           cal.set(Calendar.MINUTE, 0);
           cal.set(Calendar.SECOND, 0);
           cal.set(Calendar.MILLISECOND, 0);
            if((cal.getTime().before(value) )){
                return false;
            } 
        })
        profit (blank:false, nullable:false, validator: {value, object ->
                if (!value.toString().matches(/^([1-9]{1}[0-9]*\.{0,1}\d{0,5}|0\.[0-9]{1,2}|0|\.[0-9]{1,5})$/) ) return false;
        })     
    }

    static mapping = {
        version false
        //id generator:'assigned', name:'date'
        id column: 'date', name: 'date', generator: 'assigned'
    }

    /*def beforeInsert() {
        id = date
    }*/
}

正如您所看到的,我在 yyyy-MM-dd 日期之前将此格式用于表格中。现在,对于位于表格最后一列的删除按钮,当我将其传递给动作时,它会获得原始格式,而不是 yyyy-MM-dd ,而且可能是为什么我得到不匹配错误。问题是我该怎么做才能在将日期传递给删除操作之前编辑日期?还是有另一种删除数据的方法?谢谢。

3 个答案:

答案 0 :(得分:1)

您的 delete 控制器方法需要一个名为 date 的参数,但您的表单未提供参数。而是表单提供名为 id 的参数。要修复表单,请添加名称为 date 且值为 $ {dp.date} hidden字段。这会将DailyProfit的主键date映射到控制器方法中的date参数。

答案 1 :(得分:0)

我认为您的错误是在delete(Date date)方法之前发生的,因为该参数显然是Date而不是Long

但是如果要覆盖PreDelete事件,可以通过实现ApplicationListener<AbstractPersistenceEvent>覆盖grails上的应用程序事件,并在resources.groovy中注册该类。然后你可以像下面那样打断PreDelete

@Override
    void onApplicationEvent(AbstractPersistenceEvent event) {

            switch (event.eventType) {
                \\case EventType.PostInsert:
                \\    break
                \\case EventType.PreUpdate:
                \\    break
                case EventType.PreDelete:
                    onPreDelete(event as PreDeleteEvent)
                    break
            }
    }

def onPreDelete(PreDeleteEvent event, final User user) {
        def domain = event.entityObject
        if(!domain instance of YourDomainClass)
            return
        //edit date in your domain before delete here
    }

答案 2 :(得分:0)

一般情况下,我会说,指定日期格式和用途,

Date.format(dateFormatter, value)

将值解析为日期。例如,

class DailyProfitController {
   //point of interest
   String dateFormat = "yyyy-MM-dd"

   def save() {
    // Date myDate = params.date('test', 'yyyy-MM-dd');
    params.date_month = (Integer.parseInt(params.date_month)<10)? "0" + params.date_month : params.date_month
    params.date_day = (Integer.parseInt(params.date_day)<10)? "0" + params.date_day : params.date_day

    //another point of interest
    params.date = Date.parse(dateFormat, params.date_year + "-" + params.date_month + "-" + params.date_day)
    def dailyProfit = new DailyProfit(params)
    println params.toString()
    dailyProfit.save()
    list()
    //render(view:"profitTable")

}