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)로 되돌립니다.
다른 문제 중 하나입니다. 서비스가 지불을 완료 한 후에 지불 값을 다시 전달하지 않습니다. 결제가 처리 된 후 사용자가 리디렉션되는 URL을 지정하기 만하면됩니다. 내게 이것은 내 "사용자/신규"입니다. 아이디어는 "지불하기"버튼을 클릭하면 다음 단계로 넘어 가고 2) 브라우저가 외부 사이트로 리디렉션됩니다. 나는 OP에서 언급 한 것처럼 'billing_step'을 추가하려고 시도했지만 끝에'return '을 넣지 않으면 "너무 많은 리디렉션"오류가 발생합니다. 사용자를 다음 단계로 안내하십시오. – cdotfeli
좋아요, 그렇다면 결제가 처리 된 후 URL로만 리디렉션되는 경우 지불 세부 정보를 확인할 필요가 없습니다. 리디렉션 할 때 정의 할 수 있습니까? 그렇다면 등록 할 사용자의 고유 ID를 작성하고 리턴 URL에 해당 ID가 있어야합니다. 물론 사용자를 먼저 저장하고 "비활성"상태로 처리 한 다음 처리 된 지불 후 활성화하는 방식으로 처음 설명 된 것처럼 수행 할 수 있습니다. 서비스가 어떤 정보를 포함하지 않는지 이상한 .. –
당신은 우리에게 코드를 보여줄 수 있었고 현재 당신이 이것을하기 위해 사용하고있는 논리를보기가 더 쉬울 것입니다. –