Как передать весь объект из текущего отображаемого представления в новую форму - PullRequest
0 голосов
/ 03 мая 2020

Поэтому я пытаюсь добавить в приложение простую функцию комментирования после отображения продукта. Допустим, у меня следующий поток операций:

  1. найдите продукт и нажмите ввод
  2. отобразятся сведения о продукте и он имеет следующий URI: /search?beerName=Trashy+Blonde
  3. запись комментарий
  4. после нажатия кнопки "Отправить" мы остаемся на той же странице, и новый комментарий добавляется в базу данных (в дальнейшем он только обновит sh часть страницы)

Таким образом, я застрял между пунктами 3 и 4. В настоящее время у меня есть страница html, которая содержит информацию о продукте и форму для отправки нового комментария:

   <div class="container" th:if="${beer}">
        <br/>
        <!-- Beer details -->
        <div class="card mb-3" >
            <div class="row">
                <div class="col-md-4" style="margin: auto; display: block;">
                    <img style="  display: block; max-width:200px; max-height:250px; width: auto; height: auto;" class="card-img img-responsive mx-auto d-block" th:src="${beer.getImageUrl()}"/>
                </div>
                <div class="col-md-8" style="margin: auto; display: block;">
                    <div class="card-block px-2">
                        <h4 th:text="${beer.getName()}">Name</h4>
                        <p th:text="${beer.getDescription()}">Description</p>
                        <p th:text="${beer.getFirstBrewed()}">First Brewed</p>
                        <p th:text="${beer.getAbv()}">Abv</p>
                        <p th:text="${beer.getIbu()}">Ibu</p>
                    </div>
                </div>
            </div>
        </div>

        <!--    TODO user comment-->
        <div th:block sec:authorize="isAuthenticated()">
            <div class="row" id="post-review-box">
                <div class="col-md-12">
                    <form method="post" th:action="@{/review}" th:object="${reviewFormObject}">
                        <input id="beer-object" type="hidden">
                        <textarea class="form-control animated" cols="50" id="new-review" name="comment"
                                  placeholder="Enter your review here..." rows="5" th:field="*{message}"></textarea>

                        <div class="text-right">
                            <button class="btn btn-success btn-lg" type="submit">Save</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
  </div>

И форму для отправки объекта:

public class ReviewFormObject {

    @NotEmpty
    private String message;

    private Beer beer;

Итак, как вы можете видеть, я хотел бы иметь возможность передать вместе с объектом продукта сообщения, который уже отображен, любую идею, если это возможно или даже имеет смысл? ИЛИ, может быть, я переусердствовал что-то подобное?

Код для контроллеров выглядит так: Поиск:

@GetMapping("/search")
    public ModelAndView searchBeer(@ModelAttribute("beerFormObject") @Valid BeerFormObject beerFormObject,
                                   @ModelAttribute("reviewFormObject") ReviewFormObject reviewFormObject,
                                   BindingResult result) {

        if (result.hasErrors()) {
            return new ModelAndView("/index");
        }
        Beer beer = beerService.findByName(beerFormObject.getBeerName());
        if (beer == null) {
            try {
                beer = beerRestService.findByName(beerFormObject.getBeerName());
            } catch (ObjectNotFoundInExternalApiException e) {
                //TODO add exception handling and redirect to creating new beer
                return new ModelAndView("/index");
            }
        }

        ModelAndView modelAndView = new ModelAndView("/beer-search-result");
        modelAndView.addObject("beer", beer);
        return modelAndView;
    }

postReview:

   @PostMapping("/review")
    public String postReview(@ModelAttribute("reviewFormObject") @Valid ReviewFormObject reviewFormObject, BindingResult result){
        //doing nothung currently

        return "/test";
    }
...