2012-01-05 1 views
0

ライアン・ベイツ氏が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)に戻ります。

答えて

2

あなたは、支払いを完了するためにサードパーティのサービスを訪れている間、ユーザの現在入力されているフォームデータをセッションに保存することができます。

お支払いサービスが良好な場合、ユーザーの操作に関する詳細情報(有料かどうか)を含む情報のハッシュ(または何らかの並べ替え)が表示され、保存されたセッション情報を使用してすべてが良ければ登録を完了してください。

  1. レッツユーザー
  2. 「支払いに進んで」というタイトルのボタンを持っている必須フィールドに必要事項を記入のボタンがセッションにユーザー情報(AJAX経由または提出)を保存し、支払いゲートウェイにリダイレクト持っています必要なすべてのフィールドがこれまで通りOKならば
  3. 注文フォームにリダイレクトし、セッションの値とサービスが返却した支払いの詳細(通常は返品コールバックURLで行う)を確認してください。
  4. すべてがOKです

更新:

私は間違いなくあなたのコードでこのような何かをするだろう:これは正しいステップとリダイレクト、およびユーザーが戻って来るとき、彼らは意志へのセッションを設定します

elsif @user.billing_step? 
    @user.next_step 
    session[:user_step] = @user.current_step 
    return redirect_to("external.com") 
else 

別の条件に引き継がれる(したがって、うまくいくはずです)、下位セッション変数は削除されないので、他の条件についてもステップ値を更新し続けます。

これはまったく役に立ちますか?これはおそらく私がやる方法です。

+0

これは他の問題の1つです。支払いが完了した後、サービスは支払い値を返却しません。支払いが処理された後にユーザーがリダイレクトされるURLを指定するだけで済みます。私にとっては、これは私の "ユーザー/新規"です - アイデアは、あなたが次のステップに進むための "支払いに進む"ボタンをクリックし、2)ブラウザを外部サイトにリダイレクトします。私はOPで言及したように 'billing_step'を追加しようとしましたが、最後に 'and return'を置かない限り、「リダイレクトが多すぎます」というエラーが発生します。ユーザーを次のステップに進めます。 – cdotfeli

+1

さて、お支払いが処理された後、URLにリダイレクトするだけの場合、お支払いの詳細を確認する必要はありません。リダイレクト時に定義できますか?もしそうなら、あなたは、登録されているユーザーの一意のIDを作成し、そのURLをそのURLに持つことができます。これは、最初にユーザを保存することによって、最初に説明したように行うことができますが、「非アクティブ」状態にしてから、処理された支払い後にアクティブにします。サービスにどのような情報も含まれていないのは奇妙なものです。 –

+1

コードを表示すると、現在これを行うために使用しているロジックが分かりやすくなります。 –

関連する問題