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

时间:2013-08-11 18:35:07

标签: ruby-on-rails wizard wicked-gem

我正在尝试为巫师实施'邪恶'宝石,并且在我的生命中无法弄清楚这个错误。已经引用了Ryan bates railscast #346step by step tutorial by schneems

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

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

错误

  

WeddingStepsController中的ActiveRecord :: RecordNotFound#update

     

找不到没有身份证的婚礼:   app / controllers / wedding_steps_controller.rb:11:在`update'

     

参数:

     

{ “UTF8”=> “中✓”,    “_method”=> “中放”,    “authenticity_token”=> “中JMD + 8gf4rVqOSNMSFrKcD3WxK + X3zvYliSMWqTg0SkE =”,    “婚礼”=> { “bridename”=> “中”,    “groomname”=> “中”,    “weddingdate”=> “中”,    “weddingcity”=> “中”,    “weddingstate”=> “中”,    “URL”=> “中”},    “提交”=> “中下一步”,    “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

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


<div class="formrow center">
  <%= f.input :bridename, placeholder: "The Bride's Name", label: false %>
  <h2 class="inline">  &</h2>
  <%= f.input :groomname, placeholder: "The Groom's Name", label: false %>
</div>


<div class="formrow center">
  <%= f.text_field :weddingdate %> 
  <!-- OLD STYLE DATE FORMAT <%= f.input :weddingdate, label: "Wedding Date" %> -->
  <%= f.input :weddingcity, label: "City" %>
  <%= f.input :weddingstate, label: "State" %>
</div>


<div class="formrow center"> 
  <%= f.input :url, placeholder: "i.e. 'johnandkate' ", label: false %> 
</div>

</div>


<div class="form-actions center">
<%= f.button :submit, value: "Next" %>
</div>



<% end %>

<%= link_to 'skip', next_wizard_path(wedding_id: @wedding.id) %>

第2步:wedding_steps / eventdetails.html.erb

EVENT DETAILS STEP <!--PLACEHOLDER FOR NOW -->

的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'

2 个答案:

答案 0 :(得分:2)

这一行:

<%= 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"作为所需网址的一部分,这将导致无法生成指向该控制器的链接,除非它具有格式正确的网址。

替换此

resources :wedding_steps

用这个

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

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

答案 1 :(得分:-1)

我尝试了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