Как я могу создать маршрут и использовать путь для входа на первый шаг в многошаговой форме с помощью Wicked gem?

За последние 8 лет я пытался использовать Wicked gem 3 раза. Каждый раз я сдавался по одной и той же причине. Я пытаюсь снова, потому что, если я это понимаю, я думаю, что это будет идеально для моего варианта использования.

Моя главная проблема в том, что я не понимаю, как на самом деле запустить мастер. В примере, используемом в gem, это событие after_registration, с которым уже связан объект user. Это бесполезно, и я не думаю, что этот пример будет полезен в большинстве случаев использования.

Есть еще один пример создания Product в несколько шагов. Однако автор не может адекватно объяснить маршрутизацию. Из https://github.com/zombocom/wicked/wiki/Building-Partial-Objects-Step-by-Step:

Since Wicked uses our :id parameter we will need to have a route that also includes :product_id for instance /products/:product_id/build/:id. This is one way to generate that route:

resources :products do
  resources :build, controller: 'products/build'
end

This also means to get to the create action we don't have a product_id yet so we can either create this object in another controller and redirect to the wizard, or we can use a route with a placeholder product_id such as [POST] /products/building/build in order to hit this create action.

Хорошо, я понятия не имею, что означает вторая часть предложения в отношении placeholder product_id и названия маршрута /products/building/build. Я потратил 2 часа на это и просто перешел к пустой форме создания.

...we can either create this object in another controller and redirect to the wizard

Это то, что я пытаюсь сделать после успешного сохранения объекта @product.

redirect_to product_by_interchange_path(@product, :step1)

Это не работает. raise InvalidStepError if the_step.nil? Говорит, что мой шаг равен нулю. Это не.

redirect_to product_by_interchange_path(@product, step: :step1)

То же самое.

redirect_to product_by_interchange_path(:step1)

Это точное зеркало примера приложения восьмилетней давности. Но, конечно, @product не находится в переменной сеанса, как current_user, поэтому в этом случае ошибка заключается в том, что нет продукта с идентификатором :step1.

Пожалуйста помоги! Мне не хватает чего-то очень, очень простого здесь, но мне очень нужно упорствовать.


person AKWF    schedule 10.05.2020    source источник
comment
Было бы очень полезно увидеть действия и маршруты вашего контроллера в согласованной форме. в противном случае очень сложно отладить вашу проблему. нечестивый довольно прост - эта проблема должна быть легко решаема   -  person BKSpurgeon    schedule 11.05.2020


Ответы (1)


Хорошо, я наконец понял это. Вот что я сделал:

  1. Прежде всего, я заменил свой контроллер обратно на старый добрый ApplicationController и использовал включение include Wicked::Wizard. Я не знаю, повлияло ли это на что-то, но новый пример был выложен так же, как и старый.
  2. Я был действительно облажался с :id. Я думаю, что :id обычно является моим идентификатором объекта. У меня был закрытый метод set_product в моем контроллере, и он не работал. Когда я, наконец, понял, что :id был фактическим шагом, это заставило меня изменить свой путь в перенаправлении.
  3. Я изменил редирект с product_by_interchange_path(@product, :select_vehicle) на product_by_interchange_path(:select_vehicle, product_id: @product.id)
  4. Я избавился от своего set_product. Просто пока я пытался устранить путаницу.
  5. Я изменил вызовы поиска в мастере, чтобы использовать :product_id вместо :id.

Теперь это работает. Я до сих пор не понимаю, как я мог заглушить маршрут с заполнителем product_id, это до сих пор загадка. Но это нормально, и это работает.

person AKWF    schedule 10.05.2020