Rails集成Wicked Wizard报错:无法找到无ID的Product
解决Wicked向导中"Couldn't find Product without an ID"的问题
你遇到的问题主要出在表单提交时缺少product_id参数传递和update方法的参数赋值逻辑错误这两个点上,咱们一步步来修复:
1. 修复表单的参数传递问题
你的:general视图里用了wizard_path,但这个路径默认只携带当前step的ID,并没有带上product_id。当表单提交到update动作时,set_product方法拿不到params[:product_id],自然就会抛出找不到Product的错误。
修改表单代码,在wizard_path里显式传入product_id:
<%= form_for @product, url: wizard_path(product_id: @product.id), method: :put do |f| %> <%= f.text_field :title, class: "form-control" %> <%= f.submit "Continue", class: "btn btn-primary btn-block" %> <% end %>
2. 修正ProductStepsController的update逻辑
你当前的update方法里,错误地把params[:product_id]赋值给了@product.attributes——这完全不对,product_id只是产品的ID,并不是表单提交的产品属性数据。
先添加一个product_params私有方法来安全过滤参数,再正确更新产品属性:
class ProductStepsController < ApplicationController include Wicked::Wizard before_action :set_product, only: [:show, :update] steps :general, :categories, :pricing, :pictures def show render_wizard end def update # 用表单提交的产品参数更新,而非product_id @product.update(product_params) render_wizard @product end private def set_product @product = Product.friendly.find(params[:product_id]) end # 添加私有方法过滤允许修改的产品属性,后续步骤的属性也可以在这里补充 def product_params params.require(:product).permit(:title, # 比如后续要加的description、category_ids等都可以放在这里 ) end end
3. 可选优化:规范路由结构
如果想让路由更符合RESTful规范,可以把product_steps嵌套在products下:
resources :products do resources :product_steps, only: [:show, :update] end
这样路由会变成/products/:product_id/product_steps/:id,不过就算不改路由,前面的修复也已经能解决你的问题。
做完这些修改后,表单提交时会带上product_id,update方法也能正确更新产品属性,那个找不到Product的错误应该就会消失了。
内容的提问来源于stack exchange,提问作者Arnas Klasauskas
相关产品推荐
相关产品推荐

