3

ウィザード用の「Wicked」ジェムを実装しようとしていますが、このエラーを一生理解できません。すでにRyan bates railscast #346とschneemsによるステップバイステップのチュートリアルを参照しています。

Weddings と Wedding_steps の 2 つのコントローラーがあります。ユーザーは最初に Wedding を作成し、作成アクションが Wedding_steps コントローラー (Wicked を使用) にリダイレクトされた後、追加情報でウェディング モデルを更新します。

wedding_id は最初のステップ weddingdetails で正常に検出されますが、そのステップを送信した後、次のエラーが発生します。

エラー

ActiveRecord::WeddingStepsController の RecordNotFound#update

ID なしで Wedding が見つかりませんでした: app/controllers/wedding_steps_controller.rb:11:in `update'

パラメーター:

{"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"JMd+8gf4rVqOSNMSFrKcD3WxK+X3zvYliSMWqTg0SkE=", "結婚式"=>{"花嫁名"=>"", "花婿の名前"=>"", "weddingdate"=>"", "weddingcity"=>"", "weddingstate"=>"", "url"=>""}, "commit"=>"Next", "id "=>"wedding_id=11"}

次のステップに進むはずです/wedding_steps/eventdetails?wedding_id=11が、代わりにエラーが発生して次のステップに進みます/wedding_steps/wedding_id=11

また、Update アクションが配置されていない場合、情報は正常に保存され、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

STEP 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) %>

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

    
4

2 に答える 2

3

この行:

<%= 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。ビュー ヘルパーの 1 つまたは複数に wedding_id が適切に含まれていない可能性があり、この新しい制約により、ビューでエラーが発生しますが、不正なリンクの場所が示されるため、これは良いことです。

于 2013-08-12T01:15:03.777 に答える
-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
于 2014-11-02T15:12:15.300 に答える