1

そのため、Railscast #217 と #219 の両方に従って、Active モデルを使用して ruby​​ on rails (1.9.3) でマルチステップ フォームに取り組んでおり、/awizard/ からフォームの次のステップにルーティングする際に問題が発生しています。 /awizard/1 の初心者です。誰かが私を助けてくれることを願っています。(フォームジェムを使用できないので、これを自分で作成する必要があります) これはルーティングタイプの問題だと思います (モデルに指定した ID を使用していませんが、どこで使用すべきかわかりません) 少し助けになるでしょう感謝します!

私のコントローラーコード - (contollers/awizard_controller.rb)

class AwizardController < ApplicationController

  def new
    # New Asset Wizard
    @wizard = Awizard.new(id: 1)
    # Set session variable as initial step
    session[:wizard_step] = @wizard.current_step
  end

  def update
    @wizard = Awizard.new(id: 1) unless !@wizard.nil?
    @wizard.current_step = session[:wizard_step] unless nil

    if @wizard.valid?
      if params[:back_button]
        @wizard.previous_step
      elsif @wizard.last_step?
        @wizard.save if @wizard.all_valid?
      else
        @wizard.next_step
      end
      session[:wizard_step] = @wizard.current_step
    end

    if @wizard.changed?
      render 'form'
    else
      @wizard.save
    end
  end

  def show
    render 'form'
  end

end

マイモデル - (models/awizard.rb)

class AWizard
include ActiveModel::Validations
include ActiveModel::Conversion
include ActiveModel::Dirty
include ActiveModel::Naming

#This class is used to manage the wizard steps using ActiveModel (not ActiveRecord)

attr_accessor :id
attr_writer :current_step  #used to write to current step
define_attribute_methods [:current_step] #used for marking change

def initialize(attributes = {})
   attributes.each do |name, value|
     send("#{name}=", value)
   end
end

def current_step
  @current_step || steps.first
end

def steps
  %w[step1 step2 step3] #make list of steps (partials)
end

def next_step
  current_step_will_change! #mark changed when moving stepped
  self.current_step = steps[steps.index(current_step)+1] unless last_step?
end

def previous_step
  current_step_will_change! #mark changed when moving stepped
  self.current_step = steps[steps.index(current_step)-1] unless first_step?
end

def first_step?
  current_step == steps.first
end

def last_step?
  current_step == steps.last
end

def all_valid?
  steps.all? do |step|
    self.current_step = step
    valid?
  end
end

def step(val)
  current_step_will_change!
  self.current_step = steps[val]
end

def persisted?
  self.id == 1
end

def save
 #will do later
end

end

私の見解 - (/views/awizard/_form.html.erb)

<%=  content_for :awizard_form do%>
  <%= form_for(@wizard) do |f| %>
    <%= render "#{@wizard.current_step}_step", :f => f %>
    <%= f.submit "Previous", :name => "back_button" unless @wizard.first_step? %>
    <%= f.submit "Continue", :name => "step" unless @wizard.last_step? %>
  <% end %>
<% end %>

(/views/awizard/_step1.html.erb)

<div class="field">
  <%= f.label 'Step1' %><br />
</div>

(/views/awizard/_step2.html.erb)

<div class="field">
  <%= f.label 'Step2' %><br />
</div>

(/views/awizard/_step3.html.erb)

<div class="field">
  <%= f.label 'Step3' %><br />
</div>

路線コード

resources :awizard

エラー メッセージ 最初の [続行] ボタンをクリックした後に表示されるエラー メッセージは、「テンプレートがありません」

{:locale=>[:en]、:formats=>[:html]、:handlers=>[:erb、:builder、:coffee]} のテンプレート awizard/form、application/form がありません。検索場所: * "fakepath/app/views""

以下に示す詳細なエラー ログ -

2013-01-07 10:12:06 +1300 で 127.0.0.1 の PUT "/awizard/1" を開始 HTML パラメーターとして AwizardController#update で処理: {"utf8"=>"✓", "authenticity_token"=>" ", "awizard"=>{"data"=>"data"}, "step"=>"Continue", "id"=>"1"} 1 ミリ秒で 500 内部サーバー エラーを完了

ActionView::MissingTemplate ({:locale=>[:en]、:formats=>[:html]、:handlers=>[:erb、:builder、:coffee]} のテンプレート awizard/form、application/form がありません。検索場所: * "fakepath/app/views" ): app/controllers/awizard_controller.rb:40:in `update'

レンダリングされた fakepath/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/missing_template.erb をレスキュー/レイアウト内で (0.6ms)

4

1 に答える 1

1

エラーメッセージにはformawizardディレクトリに名前の部分がないことが示されています。パーシャルについては、Railsの規則に従う必要があります。パーシャルファイルのプレフィックスは常にアンダースコアです。

あなたの場合、名前をに変更form.html.erbしてみてください_form.html.erb

編集:あなたはこのようにあなたのパーシャルをレンダリングしようとすることができます

render :partial => 'awizard/form'
于 2012-12-20T21:58:58.620 に答える