Как скрыть параметры URL в Grails - PullRequest
2 голосов
/ 14 октября 2011

Когда пользователь создает новый объект Load, если пользователь установит флажок «Оплачено при доставке», они будут перенаправлены на контроллер Payment сразу после создания нового Load. Несколько параметров, необходимых для создания нового Load, также используются для создания нового Payment, поэтому я просто передаю параметры в перенаправлении следующим образом:

redirect(controller: "payment", action: "create", params: params)

Это прекрасно работает, но дает мне настоящий неприятный URL со всеми параметрами в нем. Как я могу передать свои параметры другому контроллеру и не дать им появиться в URL?

UPDATE:

Я должен сказать, что я ценю все предложения относительно такой маленькой проблемы. Несмотря на все предложения, все же кажется, что лучший способ сделать это - это то, как я хотел избежать, создавая карту параметров вручную в вызове redirect. Это не так уж важно, тем более что есть только несколько параметров, я просто не верю, что нет более чистого, более автоматизированного способа исправить это.

    def loadInstance = new Load(params)

    if (loadInstance.save(flush: true)) {
        Account.get(params.account.id).balance -= new BigDecimal(params.transactionAmount) 
        flash.message = "${message(code: 'default.created.message', args: [message(code: 'load.label', default: 'Load'), loadInstance.id])}"
        if(params.paidOnDelivery){
            redirect(
                controller: "payment",
                action: "create",

                //There has to be a better way than this. Just writing "params:params" results in the values being wrapped in double quotes once they get to the Payment controller. If it wasn't for that then "params:params" would work great and I would not of had to ask this question :)
                params: [
                    "account.id":params.account.id,
                    "dateOfTransaction":params.dateOfTransaction,
                    "dateOfTransaction_year":params.dateOfTransaction_year,
                    "dateOfTransaction_month":params.dateOfTransaction_month,
                    "dateOfTransaction_day":params.dateOfTransaction_day,
                    "dateOfTransaction_hour":params.dateOfTransaction_hour,
                    "dateOfTransaction_minute":params.dateOfTransaction_minute,
                    "transactionAmount":params.transactionAmount
                ]
            ) 
            return
        }
        redirect(action: "show", id: loadInstance.id)
    }
    else {
        render(view: "create", model: [loggedByUsers:loggedByUsers, accounts:accounts, cargoProviders:cargoProviders, deliveredByUsers:deliveredByUsers, loadInstance:loadInstance])
    }

Ответы [ 5 ]

4 голосов
/ 14 октября 2011

Вы можете выполнить пересылку на стороне сервера вместо перенаправления. Просто замените:

redirect(controller: "payment", action: "create", params: params)

с:

forward(controller: "payment", action: "create", params: params)

Обновление

Чтобы исправить проблему обновления, которую вы описали в комментариях, выполните переадресованное вами действие, которое отправляет перенаправление (вместо рендеринга представления), например,

class PaymentController {

  def create = {

    Integer paymentId = // Create a payment and get it's ID    
    redirect(action: 'show', id: paymentId)    
  }

  def show = {
    def id = params.id
    // show the payment with this ID
  }
}
3 голосов
/ 14 октября 2011
  1. Передайте их через параметры сеанса

или

  1. Сделайте HTTP-запрос на стороне сервера вместо перенаправления, а затем просто передайте результат клиенту
1 голос
/ 14 октября 2011

Для этого можно использовать объект flash (хотя я бы оставил реализацию как есть).

Скопируйте все ваши параметры во flash.

params.each {
  flash[it.key]=it.value
}

Вместо этого используйте карту флэшкарты параметров в действии «создать».

0 голосов
/ 14 октября 2011

Вот еще одно предложение: -)

Сохраните перенаправление с Загрузить на оплату как есть.Установите флажок в Платежном действии, если вы получаете вызов с параметрами, затем сохраните их в сеансе или мигайте и перенаправьте на то же действие без параметров.Восстановите параметры из сеанса / флэш-памяти, используя putAll, и продолжите действие.

Вроде как Post-Redirect-Get-in Payment, но на самом деле это GetWithParams-Redirect-Get.В результате получается чистый URL и проблем с обновлением нет.

Я использую его в приложении для чистых URL-адресов и для сохранения состояний в разных частях приложения (но, так как последний вам не нужен, вы должны удалить его или сохранитьэто во вспышке).

0 голосов
/ 14 октября 2011

я не пробовал, но думаю, что это решит вашу проблему.

redirect(controller: "payment", action = [POST:"create"], params: params)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...