2012-01-05 3 views
0

Ryan Bates가 Railscast에서 토론 한 것과 동일한 개념을 구현하려고합니다 : http://railscasts.com/episodes/217-multistep-forms 내 사용자로 가입하십시오.여러 단계로 구성된 양식이지만 중간에있는 다른 사이트로 리디렉션 하시겠습니까?

1 단계가 기입 사용자 세부

2 단계 : 청구 상세 정보를 완성하기 위해 외부 URL로 이동, 그들을 다시 리디렉션되는 다음과 같이

는 기본적으로 3 단계는 이 사용자는 완료되면 양식을 등록합니다.

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로 리디렉션합니다.

그런 식으로 사용자가 "users/new"로 돌아갈 때 이미 확인의 마지막 단계에 있습니다.

리디렉션 끝 부분에 "and return"명령을 추가하지 않으면 "렌더링 및/또는 리디렉션이이 작업에서 여러 번 호출되었습니다."오류가 발생합니다. 만약 그렇다면, Rails는 새로운 단계를 추가하지 않으며 모든 것을 빌링 단계 (단계 2)로 되돌립니다.

답변

2

결제를 완료하기 위해 타사 서비스를 방문하는 동안 사용자의 현재 입력 된 양식 데이터를 세션에 저장할 수 있습니다.

결제 서비스가 양호한 경우 사용자 행동 (지불 여부와 상관없이)에 대한 세부 정보가 포함 된 정보 (또는 그와 유사한 것)의 해시를 제공 한 다음 저장된 세션 정보를 사용하여 모든 것이 괜찮은 경우 등록을 완료하십시오.

  1. 하자 사용자 작성 필수 필드
  2. 라는 제목의 버튼을 "지불에 진행"가지고
  3. 버튼 (아약스를 통해 또는 제출) 사용자 정보를 저장 세션으로, 그리고 지불 게이트웨이로 리디렉션 되세요 모든 필수 필드가 지금까지도 괜찮은 경우
  4. 주문 양식으로 리디렉션하고 세션 값 및 서비스가 반환 한 지불 세부 정보 (보통 회신 콜백 URL에서 수행)를 확인하십시오.
  5. 사용자를 생성하십시오. 모든 것이 OK입니다.

업데이트 :

나는 확실히 당신의 코드로 이런 짓을 할 것이다 : 이것은 올바른 단계 및 리디렉션, 사용자가 돌아 오면 그들은 뜻에 세션을 설정

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

다른 조건으로 가져 가야하므로 (따라서 작동해야합니까?) 더 낮은 세션 변수가 제거되지 않기 때문에 다른 조건에서도 단계 값을 계속 업데이트합니다.

전혀 도움이 되나요? 아마 내가 어떻게 할 것인가.

+0

다른 문제 중 하나입니다. 서비스가 지불을 완료 한 후에 지불 값을 다시 전달하지 않습니다. 결제가 처리 된 후 사용자가 리디렉션되는 URL을 지정하기 만하면됩니다. 내게 이것은 내 "사용자/신규"입니다. 아이디어는 "지불하기"버튼을 클릭하면 다음 단계로 넘어 가고 2) 브라우저가 외부 사이트로 리디렉션됩니다. 나는 OP에서 언급 한 것처럼 'billing_step'을 추가하려고 시도했지만 끝에'return '을 넣지 않으면 "너무 많은 리디렉션"오류가 발생합니다. 사용자를 다음 단계로 안내하십시오. – cdotfeli

+1

좋아요, 그렇다면 결제가 처리 된 후 URL로만 리디렉션되는 경우 지불 세부 정보를 확인할 필요가 없습니다. 리디렉션 할 때 정의 할 수 있습니까? 그렇다면 등록 할 사용자의 고유 ID를 작성하고 리턴 URL에 해당 ID가 있어야합니다. 물론 사용자를 먼저 저장하고 "비활성"상태로 처리 한 다음 처리 된 지불 후 활성화하는 방식으로 처음 설명 된 것처럼 수행 할 수 있습니다. 서비스가 어떤 정보를 포함하지 않는지 이상한 .. –

+1

당신은 우리에게 코드를 보여줄 수 있었고 현재 당신이 이것을하기 위해 사용하고있는 논리를보기가 더 쉬울 것입니다. –

관련 문제