ライアン・ベイツ氏がRailscastで議論したのと同じコンセプトを実装しようとしています:http://railscasts.com/episodes/217-multistep-forms私のユーザ登録フォームに。複数のステップ形式ですが、間に別のサイトにリダイレクトしますか?
次のように基本的に3つのステップがあります:課金の詳細を完了するために、外部のURLにアクセスし、バックにそれらをリダイレクトします:
ステップ1.は
ステップ2ユーザの詳細を記入してくださいこのユーザーは、完了したらフォームにサインアップします。
ステップ3:を確認し、提出したデータは
現在、私の問題を回避するには、その後、最初にユーザーを作成@ user.save後に支払いを完了するために外部のURLにリダイレクトすることですが、私は、この多段階を使用したいです最初に支払いを完了しなかった場合にユーザーが保存されないようにすることができます。
私は方向性に向けることができれば感謝します。ありがとう。
UPDATE:
マイユーザーコントローラ:
def new
session[:user_params] ||= {}
if params[:plan_id].present?
@user = User.new(session[:user_params] && :plan_id => params[:plan_id])
else
@user = User.new(session[:user_params])
end
@user.current_step = session[:user_step]
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @user }
end
end
def create
session[:user_params].deep_merge!(params[:user]) if params[:user]
@user = User.new(session[:user_params])
@user.current_step = session[:user_step]
if @user.valid?
if params[:back_button]
@user.previous_step
elsif @user.last_step?
@user.save
elsif @user.billing_step?
@user.next_step
redirect_to("external.com") and return
else
@user.next_step
end
session[:user_step] = @user.current_step
end
if @user.new_record?
render "new"
else
session[:user_step] = session[:user_params] = nil
flash[:success] = "User saved"
redirect_to dashboard_url
end
end
私のユーザモデル:
validates_presence_of :username, :first_name, :last_name, :if => lambda { |u| u.current_step == "initial" }
attr_writer :current_step
def current_step
@current_step || steps.first
end
def steps
%w[initial billing confirmation]
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 billing_step?
current_step == steps.second
end
私の新しいユーザービュー:
<%= form_for @user, :url => {:action => :create, :plan_id => params[:plan_id] } do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= render "#{@user.current_step}_step", :f => f %>
<% end %>
問題がユーザーであります@userを持つコントローラ.billing_step?
送信ボタンを押した後に何が起こる必要があるのですか?1.)ステップを追加します(@ user.next_stepを使用)。2.)外部URLにリダイレクトします。
このように、ユーザーが「ユーザー/新規」に戻ると、ユーザーは確認の最終段階に入ります。
リダイレクトの最後に "and return"コマンドを追加しないと、「レンダリングまたはリダイレクトがこのアクションで複数回呼び出されました」というエラーが表示されます。もしそうなら、Railsは新しいステップを追加せず、全部の請求ステップ(ステップ2)に戻ります。
これは他の問題の1つです。支払いが完了した後、サービスは支払い値を返却しません。支払いが処理された後にユーザーがリダイレクトされるURLを指定するだけで済みます。私にとっては、これは私の "ユーザー/新規"です - アイデアは、あなたが次のステップに進むための "支払いに進む"ボタンをクリックし、2)ブラウザを外部サイトにリダイレクトします。私はOPで言及したように 'billing_step'を追加しようとしましたが、最後に 'and return'を置かない限り、「リダイレクトが多すぎます」というエラーが発生します。ユーザーを次のステップに進めます。 – cdotfeli
さて、お支払いが処理された後、URLにリダイレクトするだけの場合、お支払いの詳細を確認する必要はありません。リダイレクト時に定義できますか?もしそうなら、あなたは、登録されているユーザーの一意のIDを作成し、そのURLをそのURLに持つことができます。これは、最初にユーザを保存することによって、最初に説明したように行うことができますが、「非アクティブ」状態にしてから、処理された支払い後にアクティブにします。サービスにどのような情報も含まれていないのは奇妙なものです。 –
コードを表示すると、現在これを行うために使用しているロジックが分かりやすくなります。 –