0

Railscast #217 を変換しようとしています。AJAX を使用してパーシャルをロードするように、マルチパーシャル フォームを変更したいと考えています。ユーザーが登録できる Web サイトがあります。3 つのパーシャル (_step1.html.erb から _step3.html.erb) で構成される登録フォームがあります。

user.rbには、次および前のステップに進むための部分的な名前とメソッドの配列が含まれています。

def current_step
  @current_step || steps.first
end

def steps
  %w[step1 step2 step3]
end

def next_step
  self.current_step = steps[steps.index(current_step) + 1]
end

def previous_step
  self.current_step = steps[steps.index(current_step) - 1]
end

def first_step?
  current_step == steps.first
end

def last_step?
  current_step == steps.last
end

これに対して新しいアクションが開始されます。

def new
  @user = User.new
  session[:user_step] = nil
end

createアクションは、次のステップと前のステップの間を移動するものです。

def create
  @user = User.new(params[:user])
  respond_to do |format|
    format.js do
      @user.current_step = session[:user_step]
      if params[:prev_button]
        @user.previous_step
      elsif @user.last_step?
        @user.save
      else
        @user.next_step
      end
      session[:user_step] = @user.current_step
    end
  end
end

new.html.erbファイルは、フォームで [次へ] をクリックすると、次のパーシャルをレンダリングします。

<%= form_for(@user, :html => { :class => "form-horizontal" }, remote: true) do |f| %>
<div id="partial">
  <%= render @user.current_step, :f => f %>
</div>
<%= f.submit "Previous", class: "btn btn-primary", :name => "prev_button"   %>
<%= f.submit "Next", class: "btn btn-primary", :name => "next_button" %>

私のcreate.js.erbは次のようになります。

$("#partial").html("<%= escape_javascript(render @user.current_step) %>");

私が夢中になっているのは、作成と新しいアクションが呼び出されたときでしょうか? ルートユーザー/新規の場合、フォームに入力して [次へ] をクリックします。次に、部分ステップ 2 で [次へ] をクリックすると、部分 3 に移動します。部分 2 に戻ることはできますが、部分 2 で [前へ] をクリックしようとしても何も起こりません。パーシャル 1 に送り返されません。現在、ルート上にあるパーシャルはまだusers/newと表示されています が、パーシャル 2 と 3 の間を移動でき、パーシャル 1 に戻ることはできないため、 createアクションが呼び出されていることがわかります。部分 2 と 3 にはテキストしかありませんが、部分 1 は次のようになります。

<div class="control-group">
  <%= f.label :first_name, :class => 'control-label' %>
  <div class="controls">
    <%= f.text_field :first_name, class: 'required' %>
  </div>
</div>

<div class="control-group">
  <%= f.label :last_name, :class => 'control-label' %>
  <div class="controls">
    <%= f.text_field :last_name, class: 'required' %>
  </div>
</div>

何か案は?

私は問題を見ていると思います。パーシャル 2 と 3 をロードすると、テキストのみがレンダリングされます。しかし、部分 1 では、<%= と %> をレンダリングする必要があります。これを回避する方法についてのアイデアはありますか?

4

1 に答える 1

0

あなたが持っているものは実際に何をしますか?

current_step を設定していて、その直後に next_step を呼び出すと、 current_step が再度設定されます。次に、js.erb ファイルで next_step をもう一度呼び出します。これは、各パスで current_step が 3 回変更されることを意味します。

したがって、 current_step は、問題が発生している時点で 3 つのステップをはるかに超えている可能性があります。

于 2013-01-15T05:20:28.543 に答える