在过去的8年里,我已经尝试过3次使用Wicked gem。每一次,我都以同样的理由放弃了。我再次尝试,因为如果我理解它,我认为它将是完美的使用案例。
我的主要问题是,我不明白如何真正开始向导。在创业板中使用的例子中,它是个 after_registration
已有关联的 user
对象。这没有什么帮助,我也不认为这个例子对大多数用例有帮助。
还有一个例子是关于构建一个 Product
在多个步骤中。但是,作者没有对路由进行充分的解释。从 https:/github.comzombocomwickedwikiBuilding-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)
这和8年前的示例应用一模一样。但当然,@product并不在一个会话变量中,比如说 current_user
是,所以在这种情况下,错误是没有id为:step1的产品。
请大家帮忙! 我在这里遗漏了非常非常基本的东西,但我非常需要坚持。
好吧,我终于想通了。下面是我所做的。
ApplicationController
并使用了包括 include Wicked::Wizard
. 我不知道这是否有什么作用,但新的例子和旧的一样布置。:id
. 我在想 :id
一般是我的对象ID。我在我的控制器里有一个set_product私有方法,但它失败了。当我最终发现 :id
是实际的步骤本身,导致我改变了重定向的路径。product_by_interchange_path(@product, :select_vehicle)
到 product_by_interchange_path(:select_vehicle, product_id: @product.id)
set_product
. 就在我试图消除混乱的时候。:product_id
而不是 :id
.现在可以用了。我还是不明白,我怎么会用一个占位的product_id支出一个路由,这还是个谜。但是这个很好,而且能用。