Stage for Rails

Rails instructions

Installing

sudo gem install stage

Demonstration of usage

$ ./script/generate stage product name:string cost:integer weight:integer
exists  app/models/
exists  app/controllers/
exists  app/helpers/
create  app/views/products
exists  app/views/lahyouts/
create  app/views/products/index.html.erb
create  app/views/products/show.html.erb
create  app/views/products/new.html.erb
create  app/views/products/edit.html.erb
create  app/views/products/_form.html.erb
create  app/views/products/_data.html.erb
create  app/models/product.rb
create  app/controllers/products_controller.rb
create  app/helpers/products_helper.rb
create  db/migrate
create  db/migrate/001_create_products.rb
route  map.resources :products
The controller generated:

class PagesController < ApplicationController
  # GET /pages
  # GET /pages.xml
  def index
    @pages = Page.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @pages }
    end
  end

  # GET /pages/1
  # GET /pages/1.xml
  def show
    @page = Page.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @page }
    end
  end

  # GET /pages/new
  # GET /pages/new.xml
  def new
    @page = Page.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @page }
    end
  end

  # GET /pages/1/edit
  def edit
    @page = Page.find(params[:id])
  end

  # POST /pages
  # POST /pages.xml
  def create
    @page = Page.new(params[:page])

    respond_to do |format|
      if @page.save
        flash[:notice] = 'Page was successfully created.'
        format.html { redirect_to(@page) }
        format.xml  { render :xml => @page, :status => :created, :location => @page }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @page.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /pages/1
  # PUT /pages/1.xml
  def update
    @page = Page.find(params[:id])

    respond_to do |format|
      if @page.update_attributes(params[:page])
        flash[:notice] = 'Page was successfully updated.'
        format.html { redirect_to(@page) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @page.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /pages/1
  # DELETE /pages/1.xml
  def destroy
    @page = Page.find(params[:id])
    @page.destroy

    respond_to do |format|
      format.html { redirect_to(pages_url) }
      format.xml  { head :ok }
    end
  end
end
The edit page:

  <h1>Editing Page</h1>

  <%= render :partial => "form" %>

  <%= link_to 'Show', @page %> | 
  <%= link_to 'Back', pages_path %>
The form partial:

  <%
    submit_label = "Update" 
    submit_label = "Create" if @page.new_record?
  -%>

  <%= error_messages_for @page %>

  <% form_for(:page, :action => url(:page,@page)) do %>
    <%= partial :data %>
    <p> <%= submit_button submit_label %> </p>
  <% end %>
The data partial (the show view calls this directly):

<p>
  <b>Title</b><br />
  <%= page_title_value %>
</p>
<p>
  <b>Content</b><br />
  <%= page_content_value %>
</p>
As you can see, there are <model>_<field>_value methods. These are defined in the pages helper:

module PagesHelper
  def page_title_value
    if @action_name == "show" 
      h @page.title 
    else
      text_field_tag "page[title]",  @page.title
    end
  end

  def page_content_value
    if @action_name == "show" 
      h @page.content 
    else
      text_field_tag "page[content]",  @page.content
    end
  end

end

I need to get more precise with the form helpers, but for now this will do.

Also available in: HTML TXT