邪恶的gem在更新动作中找不到婚礼ID

我正在尝试为巫师实施’邪恶’gem,并且在我的生命中无法弄清楚这个错误。 已经引用了Ryan bates railcast#346和schneems的分步教程 。

我有2个控制器:婚礼和Wedding_steps。 用户最初创建婚礼,并在创建动作被重定向到Wedding_steps控制器(使用Wicked)以使用附加信息更新婚礼模型之后。

在weddingdetails的第一步中成功检测到wedding_id,但在提交该步骤后,我收到以下错误:

错误

WeddingStepsController#update中的ActiveRecord :: RecordNotFound

找不到没有ID的婚礼:app / controllers / wedding_steps_controller.rb:11:在`update’中

参数:

{“utf8”=>“✓”,“_ method”=>“put”,“authenticity_token”=>“JMd + 8gf4rVqOSNMSFrKcD3WxK + X3zvYliSMWqTg0SkE =”,“wedding”=> {“bridename”=>“”,“groomname” >>“”,“weddingdate”=>“”,“weddingcity”=>“”,“weddingstate”=>“”,“url”=>“”},“commit”=>“下一步”,“id” => “wedding_id = 11”}

它应该继续下一步/wedding_steps/eventdetails?wedding_id=11但反过来给出错误并转到/wedding_steps/wedding_id=11

另外值得注意的是,如果没有更新操作,信息将成功保存并重定向到Wedding Show操作。

这是相关的代码:

wedding_steps_controller.rb

 class WeddingStepsController < ApplicationController include Wicked::Wizard steps :weddingdetails, :eventdetails def show @wedding = Wedding.find(params[:wedding_id]) render_wizard end def update @wedding = Wedding.find(params[:wedding_id]) @wedding.update_attributes(params[:wedding]) render_wizard @wedding end end 

weddings_controller.rb

 def create @wedding = current_user.weddings.new(params[:wedding]) respond_to do |format| if @wedding.save format.html { redirect_to wedding_steps_path(:id => "weddingdetails", :wedding_id => @wedding.id) } format.json { render json: @wedding, status: :created, location: @wedding } else format.html { render action: "new" } format.json { render json: @wedding.errors, status: :unprocessable_entity } end end end 

第1步:wedding_steps / weddingdetails.html.erb

  wizard_path(wedding_id: @wedding.id), :method => :put, html: { class: 'form-horizontal'}) do |f| %>  

&

<!-- OLD STYLE DATE FORMAT -->

第2步:wedding_steps / eventdetails.html.erb

 EVENT DETAILS STEP  

的routes.rb

 Jobshop::Application.routes.draw do resources :pins resources :weddings resources :wedding_steps get "users/show" root :to => 'pages#home' get 'about' => 'pages#about' devise_for :admin_users, ActiveAdmin::Devise.config ActiveAdmin.routes(self) resources :inviterequests devise_for :views ActiveAdmin.routes(self) devise_for :users ActiveAdmin.routes(self) match 'users/:id' => 'users#show' 

这一行:

 <%= simple_form_for(@wedding, :url => wizard_path, :method => :put, html: { class: 'form-horizontal'}) do |f| %> 

应该:

 <%= simple_form_for(@wedding, :url => wizard_path(wedding_id: @wedding.id), :method => :put, html: { class: 'form-horizontal'}) do |f| %> 

注意wizard_path(wedding_id: @wedding.id)提交表单时,您应该在日志中看到parameters = {:wedding_id => some_number}

如果不起作用,则粘贴params的输出以进行更新操作。

编辑:

您应该将":wedding_id"作为所需url的一部分,这将导致甚至无法生成指向该控制器的链接,除非它具有格式正确的url。

替换它

 resources :wedding_steps 

有了这个

  scope "weddings/:wedding_id" do resources :wedding_steps end 

所以现在一个正确的url看起来像weddings/83/wedding_steps/weddingdetails 。 可能一个或多个视图助手没有正确地包含wedding_id,并且使用这个新约束你会在视图中引发错误,但这是一件好事,因为它会告诉你哪里有错误的链接。

我尝试了Schneems提供的解决方案,但它没有完全没有错误地运行。 我实现了以下方式。

更改

 resources :wedding_steps 

 scope "weddings/:wedding_id" do resources :wedding_steps end 

问题是根据作为ActiveModel :: ForbiddenAttributesError引发的错误,参数显示为禁止

为了摆脱这个,

更改

 def update @wedding = Wedding.find(params[:wedding_id]) @wedding.update_attributes(params[:wedding]) render_wizard @wedding end 

 def update @wedding = Wedding.find(params[:wedding_id]) @wedding.update_attributes(wedding_params) render_wizard @wedding end private def wedding_params params.require(:wedding).permit(........your parameters here.................) end