Railscast #217 に従っています。これは、パーシャルからマルチステップ フォームを作成する方法を示しています。Ryan の指示に従い、コードを動作させましたが、Rails が AJAX を使用してパーシャルをロードするようにこれを変換する方法を考えていましたか?
users_controller.rb
class UsersController < ApplicationController
...
def new
session[:user_params] ||= {}
@user = User.new
end
def create
session[:user_params].deep_merge!(params[:user]) if params[:user]
params.each do |key,value|
session.deep_merge!(key=>value) if params[:user]
end
@user = User.new(session[:user_params])
@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
if @user.new_record?
render :new
else
session[:user_step] = session[:user_params] = nil
flash[:success] = "Welcome to Friends First!"
redirect_to @user
end
...
end
user.rb
class User < ActiveRecord::Base
attr_writer :current_step
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
end
new.html.erb
<%= simple_form_for(@user) do |f| %>
<%= render 'shared/error_messages' %>
<%# render @user.current_step, :f => f %>
<div id="form"></div>
<div class="center">
<%= f.submit "Previous", class: "btn btn-primary", :name => "prev_button" unless @user.first_step? %>
<%= f.submit "Next", class: "btn btn-primary", :name => "next_button" unless @user.last_step? %>
<%= f.submit "Submit", class: "btn btn-primary", :name => "submit_button" if @user.last_step? %>
</div>
<% end %>
編集
私は私のパーシャルの1つを投稿するつもりです。変数に注意してf
ください - AJAX を使用してフォームからパーシャルにそれを渡す方法がわかりません。
_step1.html.erb
<div class="offset1">
<%= f.input :first_name %>
<%= f.input :last_name %>
<%= f.input :email %>
<%= f.input :password %>
<%= f.input :password_confirmation %>
</div>
create.js.erb
$('#form').html('<%= escape_javascript(render(@user.current_step)) %>');
これは機能しませんf
。何らかの方法で渡す必要があります。