【问题标题】:Grails - How save params to controller from another controllerGrails - 如何将参数从另一个控制器保存到控制器
【发布时间】:2017-01-18 08:48:00
【问题描述】:

我有一个具体的问题;

我是 grails 的新手,我正在尝试用这种情况编写一些测试应用程序;

我有 2 个域类

1- 汽车 2- 注册

我想添加一些品牌、型号等的汽车。用户将从列表中选择一些汽车,然后单击租车按钮。当用户单击租车按钮将在此处打开注册/创建页面时,我想获取汽车:用户所选汽车的 ID,并且用户将输入自己的一些额外信息,例如您的姓名,以及何时用户单击以保存注册按钮/列出我需要查看带有 car:id 和您的姓名条目的注册

在汽车类中,我有汽车列表,此字段是我的汽车型号;

package rentme

class Car {

    String brand
    String model
    String fuelType
    BigDecimal pricePerDay
    String busy

    static constraints = {
        brand(inList:["AUDI", "BMW", "MERCEDES", "NISSAN", "HONDA", "FORD"])
        model()
        fuelType(inList:["FUEL", "DIESEL", "AUTOGAS"])
        pricePerDay(min:0.0, max:1000.0)
        busy(inList:["YES", "NO"])

    }
}

我有注册课程,

package rentme

class Registration {

    String yourName



    static constraints = {
        yourName()
    }
}

所以我做了什么,

我在 g:each 中添加了 cars/index.gsp 这个链接;

<g:each in="${carList}" var="car">
                    <p>${car.id} </p>
                    <g:link action="create" controller="registration" params="${[car: car, carId : car.id ]}">
                        Rent Car
                    </g:link>

                </g:each>

并像这样修改了注册控制器;

 def index(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        respond Car.list(params), model:[carCount: Car.count()]
    }

现在发生了什么;当我单击租赁按钮页面时,重定向到注册/创建页面,其中包含汽车用户选择的捕获 ID;

这是我的注册/create.gsp

 <g:form action="save">
                <div><p>Car ID : ${car.id} </p></div>
                <fieldset class="form">
                    <f:all bean="registration"/>
                </fieldset>
                <fieldset class="buttons">
                    <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
                </fieldset>
            </g:form>

当填写您的姓名字段并单击保存按钮时,一切正常,所以就像它在工作但不是:)

因为当我检查我的数据库时,我没有看到选择的汽车 ID。

mysql> SELECT * FROM registration;
+----+---------+--------------+
| id | version | your_name    |
+----+---------+--------------+
| 12 |       0 | Cihan Zengin |
| 13 |       0 | Cihan        |
| 14 |       0 | ndlkdkldnkl  |
+----+---------+--------------+

但是当我点击注册/索引或注册/显示时,只有你的姓名值,但我也想看到 car:id。

如何做到这一点?请有人告诉我,因为我无法理解,也无法在互联网上找到类似的东西

【问题讨论】:

  • 不确定,但只需在 Registration 类中添加汽车 ID 即可。目前,Registration 类仅包含名称,这就是您所得到的。
  • 只是像字段一样添加?那个时候用户应该在注册/创建中再次选择汽车ID我不想这样做,我想在注册/保存后创建注册类将保存我从汽车类传递的汽车ID。
  • 你需要决定一个Registration是否属于一个Car,或者一个Car是否属于一个Registration...这里是Car A,我想把它注册给Bob。在这种情况下,可以说注册属于 Car。因此,您需要在模型中添加注释来表示这一事实,然后调整您的控制器和视图。阅读有关 hasOne 和 belongsTo 的 Grails/Gorm。
  • @railsdog 那么如何调整控制器和视图呢?你能告诉我详细的代码吗?
  • 最近有几个关于 SO 的问题与您的问题相似。所以我不愿意写代码(假设它是为了分配)。将提问者指向参考文档比编写代码要好得多(否则将如何学习?)。这并不难,你只需要付出努力。

标签: grails parameter-passing


【解决方案1】:

假设每次注册,每人只有一辆车和一个人。

首先,对于注册类:

package rentme

class Registration {

    String yourName
    Car rentedCar

    static constraints = {
        yourName()
    }
}

如您所见,我在里面添加了 Car,所以对于每个注册对象,都会有一个 Car 对象。在注册表的数据库中,将自动添加一个新列“CAR_ID”。

接下来,对于 cars/index.gsp 的每个:

<g:each in="${carList}" var="car">
    <p>${car.id} </p>
    <g:link action="create" controller="registration" params="${[carId : car.id ]}">
        Rent Car
    </g:link>

</g:each>

action="create"controller="registration" 表示registrationController 中的create() 方法将被调用,如果找到或未找到,将呈现registration/create.gsp。在registrationController中,我不确定你的索引方法是什么,但只需添加这些:

def create() {
    def selectedCar = Car.get(params.carId)

    [car: selectedCar]
}

def save() {
    def selectedCar = Car.get(params.carId)

    def registration = new Registration(
        yourName: params.yourName,
        car: selectedCar
    ).save()
}

然后,在registration/create.gsp中:

<g:form action="save">
    <div><p>Car ID : ${car.id} </p></div>
    <fieldset class="form">
        <f:all bean="registration"/>
    </fieldset>
    <fieldset class="buttons">
        <input type="hidden" name="carId" id="carId" value="${car?.id}"/>
        <input type="text" name="yourName" required>
        <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
    </fieldset>
</g:form>

create() 方法从 car/index.gsp 中获取 carId 的参数,并使用它来获取 Car 对象,并在registration/create.gsp 中渲染

registration/create.gsp 中的隐藏字段确保在提交表单时将 car id 传递给控制器​​。因此,当点击 submitButton 时,会调用 Registration Controller 中的 save() 方法,并保存一个带有检索到的 Car 对象的 Registration 对象。

我们在这里所做的有很多不好的做法,但它应该有效。如果还不清楚,请告诉我:)

【讨论】:

  • 授人以鱼,吃一夜,授人以鱼,吃一辈子。
  • 我不确定其他人,但当时我一无所知,显示代码实际上比查看其他人指出的参考资料更好更快。从您理解的角度理解某些东西,然后查看参考资料,这确实很有帮助。
  • 这是事实,但也有许多可用资源提供了比单个问题的答案更广泛的参考范围,有时是狭窄的问题。查看由“grails generate-controller”、“grails generate-views”或“grails generate-all”创建的内容,对于展示 grails 关于约定优于配置的默认观点大有帮助。然后你从那里延伸。
  • @railsdog 我是一个素食主义者,所以为自己保存鱼:)
  • @Jay 谢谢你我从示例代码中更好地理解你怎么说,我尝试你的方法但得到这个错误,URI /registration/create Class java.lang.NullPointerException 消息请求处理失败;嵌套异常是 org.grails.gsp.GroovyPagesException:处理 GroovyPageView 时出错:[views/registration/create.gsp:38] 执行标记
    时出错:在 [29] 行上评估表达式 [car.id] 时出错:不能获取空对象上的属性“id”导致无法获取空对象上的属性“id”
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2011-02-26
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
相关资源
最近更新 更多