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 では、<%= と %> をレンダリングする必要があります。これを回避する方法についてのアイデアはありますか?