Rails3の登場が待ち遠しい中、社内プロジェクトをSinatraで進めていました。
しかし、Sinatraの軽量感はいいのですが、少し大きなプロジェクトになると、app.rbが煩雑になります。
そこで、Railsみたいなディレクトリ分けをして作っていきますが、その時やはりRailsみたいにコードの自動生成が欲しくなってきます。
Padrinoを使いましょう!
軽量フレームワークSinatraを使い、Railsみたいな自動コード生成が出来ます。
http://www.padrinorb.com/
他に、Padrinoには下記のような機能が付いています。
複数の有名なテストフレームワークとの連携
複数の有名なテンプレートエンジンとの連携
データベースも複数対応
コードジェネレータ( モデル・コントローラの自動生成)
複数のアプリケーションを簡単に統合させるマウント機能
強力なルーティング機能
各種ヘルパー機能( タグ、アセット、フォーム、テキスト)
メーラー機能
管理画面自動生成
ログ収集機能
リローディング機能
国際化
Blog作成チュートリアル
下記スクリーンキャストは、作者本人による説明です。
下記内容は、公式チュートリアルに掲載していあるBlogの作成を行いました。
Padrinoフレームワークのインストール
いつもどおり、gemで一発終了です。
sample_blogプロジェクトの初期化
Railsプロジェクトと同様ですが、プロジェクトで使用するディレクトリ構成、及び、設定ファイル等を自動的に作成をしてくれます。
下記内容では、テストにshoulda、ビューにhaml、sass、ORMにactiverecordを使用するという設定です。
padrino- gen project sample_blog - t shoulda - e haml - c sass - s jquery - d activerecord - b
cd sample_blog
Routeの初期設定
既に自動生成されている下記ファイルを書き換え、テストも兼ねて「Hello World!」を入れてみましょう。
# app/app.rb
class SampleBlog < Padrino::Application
configure do
# ...
end
# Add these routes below to the app file...
get "/" do
"Hello World!"
end
get :about , :map => '/about_us' do
render :haml , "%p This is a sample blog created to demonstrate the power of Padrino!"
end
end
動作確認
padrinoを起動させて、WEBアプリケーションが出来ているか確認しましょう。
padrino start
# ブラウザで下記URLをアクセス
# http://localhost:3000/
# http://localhost:3000/about_us
管理画面作成
次に管理画面を自動生成してみましょう!
これも、自動生成が付いているので手軽に管理画面が構築出来ます。
padrino- gen admin
padrino rake ar:create
padrino rake ar:migrate
下記コマンドで、管理画面へログインする初期アカウント作成を行います。
padrino rake seed
# 任意のEメールとパスワードを入力
動作確認
padrino start
# ブラウザで下記URLをアクセス
# http://localhost:3000/admin/
モデル作成
Rails同様に、モデルも自動生成出来ます。
padrino- gen model post title:string body:text
下記自動生成された、マイグレートファイルに「t.timestamps」を追加します。
# db/migrate/002_create_posts.rb
class CreatePosts & lt; ActiveRecord::Migration
def self .up
create_table :posts do | t|
t.string :title
t.text :body
t.timestamps
end
end
def self .down
drop_table :posts
end
end
マイグレート
アクティブレコードでのマイグレーションを実行します。
DBはデフォルトで、sqlite3なので、プロジェクト直下のdbディレクトリ内に「development.db」が生成されます。
※sqlite3のファイル内容を確かめるには、TkSQLiteがお勧めです!
http://reddog.s35.xrea.com/wiki/TkSQLite.html
コントローラ自動生成
下記コマンドでコントローラを自動生成します。
URIの規則は、Railsと同様になっています。
padrino- gen controller posts get:index get:show
自動生成されたpost.rbを下記のように書き換えます。
indexは、Postモデルからデータを取得して@postsに入れてViewに渡しています。
showは、URIからidを取得して、Postモデルから検索し、@postに入れてViewに渡しています。
# app/controllers/posts.rb
SampleBlog.controllers :posts do
get :index do
@posts = Post.all ( :order =& gt; 'created_at desc' )
render 'posts/index'
end
get :show , :with =& gt; :id do
@post = Post.find_by_id ( params[ :id ] )
render 'posts/show'
end
end
ビュー作成
Hamlでビューを書いています。
# app/views/posts/index.haml
- @title = "Welcome"
#posts= partial 'posts/post', :collection => @posts
# app/views/posts/_post.haml
.post
.title = link_to post.title , url_for( :posts , :show , :id =& gt; post)
.date = time_ago_in_words( post.created_at || Time .now ) + ' ago'
.body = simple_format( post.body )
# app/views/posts/show.haml
- @title = @post .title
#show
.post
.title = @post .title
.date = time_ago_in_words( @post.created_at || Time .now ) + ' ago'
.body = simple_format( @post.body )
% p = link_to 'View all posts' , url_for( :posts , :index )
管理画面にpostモデルを追加する
下記魔法のコマンドで、先程生成した管理画面にpostモデルを追加できます。
padrino- gen admin_page post
動作確認
padrino start
# ブラウザで下記URLをアクセス
# http://localhost:3000/admin/
モデルへ新カラム追加
下記コマンドで、postモデルに、acount_idカラムを追加しています。
padrino- gen migration AddAccountToPost account_id:integer
postモデルにバリデーションルールとacountとの関連ルールを追加
# app/models/post.rb
class Post & lt; ActiveRecord::Base
belongs_to :account
validates_presence_of :title
validates_presence_of :body
end
管理画面でのpostモデル新規作成時に、accountが管理画面へログインしているユーザになるようにする
(「@post.account = current_account」の一行)
# admin/controllers/posts.rb
Admin.controllers :posts do
# ...
post :create do
@post = Post.new ( params[ :post ] )
@post .account = current_account
if @post .save
flash[ :notice ] = 'Post was successfully created.'
redirect url( :posts , :edit , :id =& gt; @post .id )
else
render 'posts/new'
end
end
# ...
end
ビューに「Posted by」を追加
アクティブレコードのお陰で、コントローラをいじらずすんなり追加できます。
# app/views/posts/show.haml
- @title = @post .title
#show
.post
.title = @post .title
.date = time_ago_in_words( @post.created_at || Time .now ) + ' ago'
.body = simple_format( @post.body )
.details
.author Posted by #{@post.account.email}
% p = link_to 'View all posts' , url_for( :posts , :index )
# app/views/posts/_post.haml
.post
.title = link_to post.title , url_for( :posts , :show , :id =& gt; post)
.date = time_ago_in_words( post.created_at || Time .now ) + ' ago'
.body = simple_format( post.body )
.details
.author Posted by #{post.account.email}
CSSの配置
下記パスより、CSSを2つ取得する。
http://github.com/padrino/sample_blog/tree/master/public/stylesheets/
配置場所:\sample_blog\public\stylesheets
動作確認
padrino start
# ブラウザで下記URLをアクセス
# http://localhost:3000/posts
感想
sinatraの手軽さを残しつつ、Railsライクなディレクトリ構成とコード自動生成が出来ます。
また、テストフレームワーク、ビュー、モデルなどが疎結合になっており、自由に選択できるところも魅力だと感じました。