· 1 min read

Screencast: Mehrstufige Formulare

Download:

Download(21.8 MB, 15:14) Alternativer Downloadfür iPod & Apple TV(20.9 MB, 15:14)

Resourcen:

Quellcode:

[bash] script/generate nifty_scaffold order shipping_name:string billing_name:string index show new [/bash]

[ruby] # models/order.rb 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

# orders_controller.rb 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 [/ruby]

[html] <% form_for @order do |f| %> <%= f.error_messages %> <%= render ”#{@order.current_step}_step”, :f => f %>

<%= f.submit “Continue” %>

<%= f.submit “Back”, :name => “back_button” unless @order.first_step? %>

<% end %> [/html]

Back to Blog