Bolero is a new way to implement Multistep or "Wizard"-type forms and workflows in Rails. The goal of Bolero is to keep your controllers simple, to avoid storing partially created objects in your database, and to make it easy to make changes to the order or the contents of various steps of your forms.
Add this to your Gemfile
gem "bolero", github: "bitpeel/bolero"
Then run bundle install
to install the gem.
rails g bolero:install
rake db:migrate
Define your routes in routes.rb
using any convention you like.
...
namespace :signup do
get "username", to: "username#new"
post "username", to: "username#create"
get "details", to: "details#new"
post "details", to: "details#create"
...
end
...
# app/controllers/signup/username_controller.rb
class Signup::UsernameController < ApplicationController
def new
@step = UsernameStep.new(session: session)
end
def create
@step = UsernameStep.new(session: session)
@step.assign_attributes(username_params)
if @step.save
redirect_to @step.next_step_path
else
render :new
end
end
private
def username_params
params.require(:username_step).permit(:username, :email, :password)
end
end
# app/views/signup/username/new.html.haml
<%= simple_form_for @step, url: signup_username_path, method: :post do |f| %>
<%= f.input :username %>
<%= f.input :password %>
<%= f.input :email %>
<%= f.button :submit %>
<% end %>
# app/multisteps/signup/username_step.rb
class Signup::UsernameStep
include Bolero::Step
attr_bolero_accessor :username, :password, :email
validates :username, presence: true, length: { minimum: 4, maximum: 30 }
validates :email, presence: true
validates :password, presence: true
def path
url_helpers.signup_username_path
end
def next_step_path
url_helpers.signup_details_path
end
end
Bolero::PersistedStep.all