Rails3の登場が待ち遠しい中、社内プロジェクトをSinatraで進めていました。 しかし、Sinatraの軽量感はいいのですが、少し大きなプロジェクトになると、app.rbが煩雑になります。 そこで、Railsみたいなディレクトリ分けをして作っていきますが、その時やはりRailsみたいにコードの自動生成が欲しくなってきます。
Padrinoを使いましょう!
軽量フレームワークSinatraを使い、Railsみたいな自動コード生成が出来ます。 http://www.padrinorb.com/
- 複数の有名なテストフレームワークとの連携
- 複数の有名なテンプレートエンジンとの連携
- データベースも複数対応
- コードジェネレータ(モデル・コントローラの自動生成)
- 複数のアプリケーションを簡単に統合させるマウント機能
- 強力なルーティング機能
- 各種ヘルパー機能(タグ、アセット、フォーム、テキスト)
- メーラー機能
- 管理画面自動生成
- ログ収集機能
- リローディング機能
- 国際化
Blog作成チュートリアル
下記スクリーンキャストは、作者本人による説明です。
下記内容は、公式チュートリアルに掲載していあるBlogの作成を行いました。
Padrinoフレームワークのインストール
いつもどおり、gemで一発終了です。
gem install padrino
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 < 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
padrino rake ar:migrate
コントローラ自動生成
下記コマンドでコントローラを自動生成します。 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 => 'created_at desc') render 'posts/index' end get :show, :with => :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 => 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 < 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 => @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 => 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ライクなディレクトリ構成とコード自動生成が出来ます。 また、テストフレームワーク、ビュー、モデルなどが疎結合になっており、自由に選択できるところも魅力だと感じました。
