Skip to content

Instantly share code, notes, and snippets.

@mnowakowski
Created April 6, 2009 12:57
Show Gist options
  • Save mnowakowski/90750 to your computer and use it in GitHub Desktop.
Save mnowakowski/90750 to your computer and use it in GitHub Desktop.
rails-template.rb
# rails-template.rb
# by Marcin Nowakowski (mymanufactory.com)
#-------------------------
# Plugins and Gems
#-------------------------
plugin 'rspec', :git => 'git://github.com/dchelimsky/rspec.git'
plugin 'rspec-rails', :git => 'git://github.com/dchelimsky/rspec-rails.git'
plugin 'exception_notifier', :git => 'git://github.com/rails/exception_notification.git'
plugin 'authlogic', :git => 'git://github.com/binarylogic/authlogic.git'
plugin 'authlogic_openid', :git => 'git://github.com/binarylogic/authlogic_openid.git'
#plugin 'asset_packager', :git => 'http://synthesis.sbecker.net/pages/asset_packager'
plugin 'open_id_authentication', :git => 'git://github.com/rails/open_id_authentication.git'
#plugin 'role_requirement', :git => 'git://github.com/timcharper/role_requirement.git'
#plugin 'restful-authentication', :git => 'git://github.com/technoweenie/restful-authentication.git'
plugin 'jrails', :svn => 'http://ennerchi.googlecode.com/svn/trunk/plugins/jrails'
#gem 'ruby-openid'
#rake("gems:install", :sudo => true)
generate("rspec")
#-------------------------
# Authlogic with OpenID
#-------------------------
if yes?("Do you want to use Authlogic?")
generate("session user_session notifier")
generate(:controller, "user_sessions users")
#generate(:scaffold, "person name:string")
#route "map.resource :account, :controller => 'users'"
#route "map.login '/login', :controller => 'user_sessions', :action => 'new'"
#route "map.root :controller => 'user_sessions', :action => 'new'"
file "config/routes.rb",
%q{ActionController::Routing::Routes.draw do |map|
map.login '/login', :controller => 'user_sessions', :action => 'new'
map.resource :account, :controller => "users"
map.resources :users
map.resource :user_session
map.resource :amnesia, :controller => "password_resets"
map.resources :password_resets
map.root :controller => "user_sessions", :action => "new"
end
}
# Initial Migration
file "db/migrate/20081103171327_create_users.rb",
%q{class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.timestamps
t.string :login, :null => false
t.string :crypted_password, :null => false
t.string :password_salt, :null => false
t.string :persistence_token, :null => false
t.integer :login_count, :default => 0, :null => false
t.datetime :last_request_at
t.datetime :last_login_at
t.datetime :current_login_at
t.string :last_login_ip
t.string :current_login_ip
end
add_index :users, :login
add_index :users, :persistence_token
add_index :users, :last_request_at
end
def self.down
drop_table :users
end
end
}
file "db/migrate/20081106072031_create_sessions.rb",
%q{class CreateSessions < ActiveRecord::Migration
def self.up
create_table :sessions do |t|
t.string :session_id, :null => false
t.text :data
t.timestamps
end
add_index :sessions, :session_id
add_index :sessions, :updated_at
end
def self.down
drop_table :sessions
end
end
}
file "db/migrate/20090103190120_add_users_openid_field.rb",
%q{class AddUsersOpenidField < ActiveRecord::Migration
def self.up
add_column :users, :openid_identifier, :string
add_index :users, :openid_identifier
change_column :users, :login, :string, :default => nil, :null => true
change_column :users, :crypted_password, :string, :default => nil, :null => true
change_column :users, :password_salt, :string, :default => nil, :null => true
end
def self.down
remove_column :users, :openid_identifier
[:login, :crypted_password, :password_salt].each do |field|
User.all(:conditions => "#{field} is NULL").each { |user| user.update_attribute(field, "") if user.send(field).nil? }
change_column :users, field, :string, :default => "", :null => false
end
end
end
}
file "db/migrate/20090103190301_create_openid_tables.rb",
%q{class CreateOpenidTables < ActiveRecord::Migration
def self.up
create_table :open_id_authentication_associations, :force => true do |t|
t.integer :issued, :lifetime
t.string :handle, :assoc_type
t.binary :server_url, :secret
end
create_table :open_id_authentication_nonces, :force => true do |t|
t.integer :timestamp, :null => false
t.string :server_url, :null => true
t.string :salt, :null => false
end
end
def self.down
drop_table :open_id_authentication_associations
drop_table :open_id_authentication_nonces
end
end
}
file "db/migrate/20090103194105_add_users_password_reset_fields.rb",
%q{class AddUsersPasswordResetFields < ActiveRecord::Migration
def self.up
add_column :users, :perishable_token, :string, :default => "", :null => false
add_column :users, :email, :string, :default => "", :null => false
add_index :users, :perishable_token
add_index :users, :email
end
def self.down
remove_column :users, :perishable_token
remove_column :users, :email
end
end
}
file "db/migrate/20090220131651_add_time_zones_to_user.rb",
%q{class AddTimeZonesToUser < ActiveRecord::Migration
def self.up
add_column :users, :time_zone, :string
end
def self.down
remove_column :users, :time_zone
end
end
}
rake "db:migrate"
# config for user and session (authlogic)
file "app/controllers/application_controller.rb",
%q{class ApplicationController < ActionController::Base
helper :all
helper_method :current_user_session, :current_user
filter_parameter_logging :password, :password_confirmation
private
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.record
end
def require_user
unless current_user
store_location
flash[:notice] = "You must be logged in to access this page"
redirect_to new_user_session_url
return false
end
end
def require_no_user
if current_user
store_location
flash[:notice] = "You must be logged out to access this page"
redirect_to account_url
return false
end
end
def store_location
session[:return_to] = request.request_uri
end
def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
session[:return_to] = nil
end
end
}
file "app/controllers/user_sessions_controller.rb",
%q{class UserSessionsController < ApplicationController
before_filter :require_no_user, :only => [:new, :create]
before_filter :require_user, :only => :destroy
def new
@user_session = UserSession.new
end
def create
@user_session = UserSession.new(params[:user_session])
# We are saving with a block to accomodate for OpenID authentication
# If you are not using OpenID you can save without a block:
#
# if @user_session.save
# # ... successful login
# else
# # ... unsuccessful login
# end
@user_session.save do |result|
if result
flash[:notice] = "Login successful!"
redirect_back_or_default account_url
else
render :action => :new
end
end
end
def destroy
current_user_session.destroy
flash[:notice] = "Logout successful!"
redirect_back_or_default new_user_session_url
end
end
}
file "app/controllers/users_controller.rb",
%q{class UsersController < ApplicationController
#before_filter :require_no_user, :only => [:new, :create]
before_filter :require_user, :only => [:show, :edit, :update]
def new
@user = User.new
end
def create
@user = User.new(params[:user])
@user.save do |result|
if result
flash[:notice] = "Account registered!"
redirect_back_or_default account_url
else
render :action => :new
end
end
end
def show
@user = current_user
end
def edit
@user = current_user
end
def update
@user = current_user # makes our views "cleaner" and more consistent
@user.attributes = params[:user]
@user.save do |result|
if result
flash[:notice] = "Account updated!"
redirect_to account_url
else
render :action => :edit
end
end
end
end
}
file "app/models/user.rb",
%q{class User < ActiveRecord::Base
acts_as_authentic
end
}
file "app/models/user_session.rb",
%q{class UserSession < Authlogic::Session::Base
logout_on_timeout true
end
}
file "app/models/notifier.rb",
%q{class Notifier < ActionMailer::Base
default_url_options[:host] = "localhost:3000"
def password_reset_instructions(user)
subject "Password Reset Instructions"
from "Notifier <your_email@your_doamin.com>"
recipients user.email
sent_on Time.now
body :edit_password_reset_url => edit_password_reset_url(user.perishable_token)
end
end
}
#layout for authlogic
file "public/javascripts/sessions_new.js",
%q{$(document).ready(function() {
//$.cookie('openid_login', null);
function clearIt(){
$('#password').val("");
$('#login').val("");
$('#openid_url').val("");
}
var openid_cookie = $.cookie('openid_login');
if (openid_cookie != 'true'){
$("#openidform").hide();
$("#hideopenid").hide();
$("#showopenid").show();
$("#regularform,").show();
} else {
$("#openidform").show();
$("#hideopenid").show();
$("#showopenid").hide();
$("#regularform,").hide();
}
$("#showopenid").click(function() {
$(this).hide();
$("#hideopenid").show();
$("#regularform").slideUp("slow", function(){
$('#openidform').slideDown('slow');
});
clearIt();
$.cookie('openid_login', 'true', { path: '/', expires: 365 });
});
$("#hideopenid").click(function() {
$(this).hide();
$("#showopenid").show();
$("#openidform").slideUp("slow", function(){
$('#regularform').slideDown('slow');
});
clearIt();
$.cookie('openid_login', 'false', { path: '/', expires: 365 });
});
});
}
file "app/views/user_sessions/new.html.erb",
%q{<% content_for :javascript do %>
<%= javascript_include_tag "user_sessions_new" %>
<% end %>
<% form_for @user_session, :url => user_session_path do |f| %>
<fieldset>
<%= f.error_messages %>
<ol id='regularform'>
<li>
<%= f.label :login %> <a href="javascript:void(0);" title="OpenID" id="showopenid" style="display:none;" class='small'>login using OpenID</a>
<%= f.text_field :login, :class => 'default-field' %>
</li>
<li>
<%= f.label :password %> <%= link_to "forgot?", amnesia_path, :class => 'small' %>
<%= f.password_field :password, :class => 'default-field' %>
</li>
</ol>
<ol id='openidform'>
<li>
<%= f.label :openid_identifier %> <a href="javascript:void(0);" id="hideopenid" style="display:none;" class='small'>login using standard user name / password</a>
<%= f.text_field :openid_identifier, :class => 'default-field' %>
</li>
</ol>
<ol class='last'>
<li>
<%= f.check_box :remember_me, :class => 'default-checkbox' %><%= f.label :remember_me %>
</li>
</ol>
<%= f.submit "Login", :class => 'default-btn' %> <%= link_to "Register", new_account_path %>
</fieldset>
<% end %>
}
file "app/views/notifier/password_reset_instructions.erb",
%q{A request to reset your password has been made.
If you did not make this request, simply ignore this email.
If you did make this request just click the link below:
<%= @edit_password_reset_url %>
If the above URL does not work try copying and pasting it into your browser.
If you continue to have problem please feel free to contact us.
}
file "app/views/users/new.html.erb",
%q{<% form_for @user, :url => account_path do |f| %>
<fieldset>
<%= f.error_messages %>
<%= render :partial => 'form', :object => f, :locals => {:form => f, :btn_name => 'Register', :cancel_name => 'Cancel', :cancel_path => root_path} %>
</fieldset>
<div class="required">*) required fields</div>
<% end %>
}
file "app/views/users/edit.html.erb",
%q{<% form_for @user, :url => account_path do |f| %>
<fieldset>
<%= f.error_messages %>
<%= render :partial => 'form', :object => f, :locals => {:form => f, :btn_name => 'Update', :cancel_name => 'Cancel', :cancel_path => root_path} %>
</fieldset>
<% end %>
<br /><%= link_to "My Profile", account_path %>
}
file "app/views/users/show.html.erb",
%q{<p>Login <%= @user.login %></p>
<p>Login count <%= @user.login_count %></p>
<p>Login request at <%= @user.last_request_at %></p>
<p>Last login at <%= @user.last_login_at %></p>
<p>Current login at <%= @user.current_login_at %></p>
<p>Last logni ip <%= @user.last_login_ip %></p>
<p>Current login ip <%= @user.current_login_ip %></p>
<p>Email <%= @user.email %></p>
<p>OpenId URL <%= @user.openid_identifier %></p>
<p>Time zone <%= @user.time_zone %></p>
<p><%= link_to 'Edit', edit_account_path %></p>
}
file "app/views/users/_form.erb",
%q{<ol class="last">
<li>
<%= form.label :login %><sup class="required-star">*</sup>
<%= form.text_field :login, :class => 'default-field' %>
</li>
<li>
<%= form.label :password, form.object.new_record? ? nil : "Change password" %><% if form.object.new_record? %><sup class="required-star">*</sup><% end %>
<%= form.password_field :password, :class => 'default-field' %>
</li>
<li>
<%= form.label :password_confirmation %>
<%= form.password_field :password_confirmation, :class => 'default-field' %>
</li>
<li>
<%= form.label :openid_identifier %>
<%= form.text_field :openid_identifier, :class => 'default-field' %>
</li>
<li>
<%= form.label :email %><sup class="required-star">*</sup>
<%= form.text_field :email, :class => 'default-field' %>
</li>
<li>
<%= form.label :time_zone %><br />
<%= form.time_zone_select :time_zone %>
</li>
</ol>
<ol class="buttons">
<li><%= form.submit btn_name, :class => 'default-btn' %></li>
<li><%= link_to cancel_name, cancel_path %></li>
</ol>
}
file "app/views/password_resets/edit.html.erb",
%q{<% form_for @user, :url => password_reset_path, :method => :put do |f| %>
<fieldset>
<%= f.error_messages %>
<ol class="last">
<li>
<%= f.label :password %>
<%= f.password_field :password, :class => 'default-field' %>
</li>
<li>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, :class => 'default-field' %>
</li>
</ol>
<ol class="buttons">
<li><%= f.submit "Update my password and log me in", :class => 'default-btn' %></li>
</ol>
</fieldset>
<% end %>
}
file "app/views/password_resets/new.html.erb",
%q{<p>Fill out the form below and instructions to reset your password will be emailed to you:</p>
<% form_tag password_resets_path do %>
<fieldset>
<ol class="last">
<li>
<label>Email:</label>
<%= text_field_tag "email", nil, :class => 'default-field' %>
</li>
</ol>
<ol class="buttons">
<li><%= submit_tag "Reset my password",:class => 'default-btn' %></li>
<li><%= link_to "Cancel", root_path %></li>
</ol>
</fieldset>
<% end %>
}
end
file "app/views/layouts/application.html.erb",
%q{<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>App Name</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="description" content="App Name app" />
<meta name="keywords" content="App Name" />
<%= stylesheet_link_tag 'application' %>
<%= javascript_include_tag :defaults %>
<%= javascript_include_tag 'jquery.cookie.js', 'jquery.tablehover.min.js' %>
<%= yield :javascript %>
</head>
<body>
<div id="content">
<div id="top">
<p><a href="#">John Smith</a> &middot; <a href="#">Logout</a></p>
</div>
<div id="logo">
<h1><a href="#">App Name</a></h1>
<p>sub name or slogan</p>
</div>
<div id="navcontainer">
<ul id="navlist">
<li id="active"><a href="#" id="current">Dashboard</a></li>
<li><a href="#">Profile</a></li>
</ul>
</div>
<div id="main">
<h2><a href="#">Aliquam metus turpis, luctus ac, sagittis eget h2</a></h2>
<p>Suspendisse egestas fringilla odio. Donec lacinia tristique ante. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam blandit ultricies nisl. Nullam dapibus, mauris id scelerisque feugiat, sapien augue porta ipsum, ut blandit tellus enim vel mauris. <a href="#">Praesent</a> accumsan metus vel ipsum. Maecenas aliquam blandit mi. Pellentesque dolor magna, posuere vel, condimentum id, accumsan ac, diam. Phasellus vel leo. Aenean velit nisl, hendrerit eget, rutrum quis, lobortis nec, libero. Nulla venenatis, turpis eu vestibulum tincidunt, felis diam luctus velit, facilisis cursus mi ligula vitae nunc. Aenean velit nisl, hendrerit eget, rutrum quis, lobortis nec, libero. Nulla venenatis, turpis eu vestibulum tincidunt, felis diam luctus velit, facilisis cursus mi ligula vitae nunc. Aenean velit nisl, hendrerit eget, rutrum quis, lobortis nec, libero. Nulla venenatis, turpis eu vestibulum tincidunt, felis diam luctus velit, facilisis cursus mi ligula vitae nunc.</p>
<h3>Etiam blandit ultricies nisl h3</h3>
<p>Suspendisse egestas fringilla odio. Donec lacinia tristique ante. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam blandit ultricies nisl. Nullam dapibus, mauris id scelerisque feugiat, sapien augue porta ipsum, ut blandit tellus enim vel mauris. <a href="#">Praesent</a> accumsan metus vel ipsum. Maecenas aliquam blandit mi. Pellentesque dolor magna, posuere vel, condimentum id, accumsan ac, diam. Phasellus vel leo. Aenean velit nisl, hendrerit eget, rutrum quis, lobortis nec, libero. Nulla venenatis, turpis eu vestibulum tincidunt, felis diam luctus velit, facilisis cursus mi ligula vitae nunc. Aenean velit nisl, hendrerit eget, rutrum quis, lobortis nec, libero. Nulla venenatis, turpis eu vestibulum tincidunt, felis diam luctus velit, facilisis cursus mi ligula vitae nunc. Aenean velit nisl, hendrerit eget, rutrum quis, lobortis nec, libero. Nulla venenatis, turpis eu vestibulum tincidunt, felis diam luctus velit, facilisis cursus mi ligula vitae nunc.</p>
<h2>Login</h2>
<div class="positive_notice">Positive <a href='#'>notice</a></div>
<div class="neutral_notice">Neutral <a href='#'>notice</a></div>
<div class="negative_notice">Negative <a href='#'>notice</a></div>
<%= yield %>
<table class="basetable" cellpadding="0" cellspacing="0">
<tr>
<th>Project name</th>
<th>Company</th>
<th>Costs</th>
</tr>
<tr>
<td class="blue">Layout (re-design)</td>
<td class="blue">Builtit</td>
<td class="blue">1000.0</td>
<td class="yellow"><a href="#">Show</a></td>
<td class="yellow"><a href="#">Edit</a></td>
<td class="yellow"><a href="#">Destroy</a></td>
</tr>
<tr>
<td class="blue">Web CMS</td>
<td class="blue">Dropit</td>
<td class="blue">200.0</td>
<td class="yellow"><a href="#">Show</a></td>
<td class="yellow"><a href="#">Edit</a></td>
<td class="yellow"><a href="#">Destroy</a></td>
</tr>
</table>
</div>
<div id="main-right">
<div id="adv">
<p>Advertising</p>
</div>
<div id="shortnews">
<div class="news">
<h3><a href="#">Suspendisse odio orci</a></h3>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut pretium mauris nec arcu.</p>
</div>
<h3><a href="#">Nam tortor libero, dictum porta</a></h3>
<p>Aliquam lacus massa, pellentesque sit amet, feugiat et, cursus volutpat, massa. Integer nibh. Maecenas mattis ipsum a felis.</p>
<div class="important important-green">
<h3><a href="#">Nam tortor libero, dictum porta</a></h3>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut pretium mauris nec arcu. Integer at leo vel ipsum elementum sodales. Nam est quam, posuere non, feugiat nec, consectetuer ac, lectus. Aenean faucibus. Suspendisse euismod, leo ut pretium ornare, libero arcu malesuada ipsum, at convallis pede augue at arcu. Aliquam lacus massa, pellentesque sit amet, feugiat et, cursus volutpat, massa.</p>
</div>
<div class="important important-blue">
<h3><a href="#">Nam tortor libero, dictum porta</a></h3>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut pretium mauris nec arcu. Integer at leo vel ipsum elementum sodales. Nam est quam, posuere non, feugiat nec, consectetuer ac, lectus. Aenean faucibus. Suspendisse euismod, leo ut pretium ornare, libero arcu malesuada ipsum, at convallis pede augue at arcu. Aliquam lacus massa, pellentesque sit amet, feugiat et, cursus volutpat, massa.</p>
</div>
</div>
</div>
<div id="line"></div>
<div id="left">
<h3>Previous Articles</h3>
<ul>
<li><a href="#">Lorem ipsum dolor</a></li>
<li><a href="#">Lorem ipsum dolor</a></li>
<li><a href="#">Aenean velit nisl, hendrerit eget, rutrum quis, lobortis nec, libero. Nulla venenatis, turpis eu vestibulum tincidunt, felis diam luctus velit, facilisis</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
</ul>
</div>
<div id="right">
<div id="rl">
<ul>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
</ul>
</div>
<div id="rr">
<ul>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
<li><a href="#">Lorem ipsum dolor sit amet, consectetuer</a></li>
</ul>
</div>
<p class="border">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut pretium mauris nec arcu. Integer at leo vel ipsum elementum sodales. Nam est quam, posuere non, feugiat nec, consectetuer ac, lectus. Aenean faucibus. Suspendisse euismod, leo ut pretium ornare, libero arcu malesuada ipsum, at convallis pede augue at arcu. Aliquam lacus massa, pellentesque sit amet, feugiat et, cursus volutpat, massa.</p>
</div>
<div id="footer">
<div id="fl">
<p>&copy; Copyright <a href="http://www.mymanufactory.com/">mymanufactory.com</a> &middot; Created by <a href="http://www.mymanufactory.com/">newman</a></p>
</div>
<div id="fr">
<h4>MyManufactory RSS</h4>
<ul>
<li><a href="http://www.mymanufactory.com/2009/1/16/zmiany">Zmiany...</a></li>
<li><a href="http://www.mymanufactory.com/2009/1/1/merb-is-rails-rails-is-merb">Merb is Rails, Rails is Merb</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>
}
# Update jrails to newest jquery
run "curl -L http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js > public/javascripts/jquery.js"
# Extra jQuery plugins
run "touch public/javascripts/jquery.cookie.js public/javascripts/jquery.tablehover.min.js"
run "curl -L http://plugins.jquery.com/files/jquery.cookie.js.txt > public/javascripts/jquery.cookie.js"
run "curl -L http://123.rentoni.com/javascripts/jquery.tablehover.min.js > public/javascripts/jquery.tablehover.min.js"
#-------------------------
# CSS
#-------------------------
run "touch public/stylesheets/application.css"
run "curl -L http://public.mymanufactory.com/projects/css-template/style.css > public/stylesheets/application.css"
#-------------------------
# Remove unnecessary files
#-------------------------
run 'rm public/index.html'
#-------------------------
# SUCCESS!
#-------------------------
puts "SUCCESS!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment