邪恶的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