Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- attr_writer :current_step
- validates_presence_of :shipping_name, :if => lambda { |o| o.current_step == "shipping" }
- validates_presence_of :billing_name, :if => lambda { |o| o.current_step == "billing" }
- def current_step
- @current_step || steps.first
- end
- def steps
- %w[shipping 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 all_valid?
- steps.all? do |step|
- self.current_step = step
- valid?
- end
- end
- def new
- session[:order_params] ||= {}
- @order = Order.new(session[:order_params])
- @order.current_step = session[:order_step]
- end
- def create
- session[:order_params].deep_merge!(params[:order]) if params[:order]
- @order = Order.new(session[:order_params])
- @order.current_step = session[:order_step]
- if @order.valid?
- if params[:back_button]
- @order.previous_step
- elsif @order.last_step?
- @order.save if @order.all_valid?
- else
- @order.next_step
- end
- session[:order_step] = @order.current_step
- end
- if @order.new_record?
- render "new"
- else
- session[:order_step] = session[:order_params] = nil
- flash[:notice] = "Order saved!"
- redirect_to @order
- end
- end
- <% form_for @order do |f| %>
- <%= f.error_messages %>
- <%= render "#{@order.current_step}_step", :f => f %>
- <p><%= f.submit "Continue" %></p>
- <p><%= f.submit "Back", :name => "back_button" unless @order.first_step? %></p>
- <% end %>
Add Comment
Please, Sign In to add comment