爲了開發Padrino應用,咱們得先有點兒準備吧。顯然,咱們得先把Ruby和RubyGems裝了;而後,再來安裝Padrino框架:javascript
$ gem install padrino
點擊這裏瞭解關於安裝的詳細信息。安裝流程一旦完成,全部必需的依賴項也都自動準備就緒,咱們如今就能夠開始開發本身的博客了。css
原湯化原食。建立Padrino程序的最佳方式採用Padrino生成器。相似 於Rails,Padrino也有一個用來建立包含項目全部必備程序和資源的生成器。Padrino是一個混合型框架(agnostic framework)並支持大量不一樣的模板、測試、JavaScript和數據庫組件。推薦閱讀《生成器指南》來獲取更詳細信息。html
就這個示例程序而言,咱們將採用ActiveRecord ORM、Haml模板語言、Shoulda測試框架和jQuery類庫。基於這些考慮,咱們如今來建立這個新項目:java
$ padrino g project sample_blog -t shoulda -e haml -c sass -s jquery -d activerecord -b
這行命令將爲咱們生成Padrino項目的基礎文件並打印出生成報告。能夠從這裏查看這條生成命令的輸出信息示例。須要注意的是,-b參數自動指引bundler安裝相關的依賴項。如今咱們進入新項目文件夾:jquery
$ cd sample_blog
如今,咱們已經從終端中進入到項目文件目錄了,讓咱們更近距離地看一下這些可愛的文件吧:git
除此以外,還生成了一些重要的目錄:github
如今,咱們來檢查config/database.rb文件以確保數據庫鏈接配置是正確的。截至目前,默認配置對於示例指導來講是可用的。項目將採用存儲在db/sample_blog_development.db中Sqlite3數據庫。web
咱們再建立一些簡單的路由來演示Padrino的路由系統。進入app/app.rb文件並輸入:sql
# app/app.rb class SampleBlog::App register Padrino::Rendering register Padrino::Helpers # Add these routes below to the app file... get "/" do "Hello World!" end get :about, :map => '/about_us' do render :haml, "%p Padrino 博客開發示例" end end
能夠看到:第一條路由建立一個字符用來返回應用的根URL;第二條路由將"/about_us"顯式映射到由Haml輸出的「關於」頁面;符號:about用來引用這條路由。shell
強烈建議親查看《控制器指南》來對路由系統有一個綜合的瞭解喲!
接下來,爲了方便對項目中的數據進行增刪改查,咱們來創建Padrino後臺管理面板。在終端程序中輸入:
sample_blog $ padrino g admin
sample_blog $ bundle install
這兩行命令將爲項目創建管理子程序,並在config/apps.rb文件中聲明對本身的掛載。經過這裏能夠查看該命令的輸出結果。
而後,輸入下面的指令來建立數據庫、運行遷移並運行db/seeds.rb裏的種子(seed)任務:
sample_blog $ padrino rake ar:create sample_blog $ padrino rake ar:migrate sample_blog $ padrino rake seed
在這個過程當中,系統將提示你輸入登陸管理系統所用的電子郵箱和密碼。
若是你想要了解更多關於管理面板的功能和特性,歡迎閱讀《管理面板指南》。
Padrino項目創建了、數據庫也配置了、管理系統也搭好了,輪到啓動Padrino應用服務器的時候了!用內建的Padrino任務來作其實很是簡單,只要在終端裏執行下面這條命令:
sample_blog $ padrino start
不出意外你應該從終端看到以下輸出:
=> Located unlocked Gemfile for development => Padrino/0.10.2 has taken the stage development on port 3000 >> Thin web server (v1.2.7 codename This Is Not A Web Server) >> Maximum connections set to 1024 >> Listening on localhost:3000, CTRL+C to stop
要想了解操做Padrino的終端命令,那就閱讀《開發與終端命令》指南。
你的程序如今已經在http://localhost:3000(樓主:Mac和Linux用戶能夠無比優越地直接簡寫爲0:3000)恭候你的大駕光臨了。在瀏覽器中訪問該網址,你能夠看到著名的「Hello World!」咱們還能夠經過下面這行網址進入管理界面:
固然須要登陸囉,還記得在執行rake seed命令時寫的登陸郵箱和密碼吧。登陸後,你能夠盡情探索Padrino的後臺管理功能,不過咱們將晚一點兒再來介紹更詳細的信息。若是你想獲取更多關於這方面的資料,能夠閱讀《管理面板指南》。
順便說一下,Padrino在開發模式中徹底支持代碼重裝。啥,你問這是啥?這就是說你可讓Padrino服務器一邊跑一邊修改源代碼,只須要刷新一下瀏覽器,光彩立現!建議你專門開一個終端程序來跑Padrino服務器程序。
好,程序OK了、佈局也定好了,如今咱們來實現建立和展現博文的功能。
首先在應用目錄中生成模型。和版本0.10.0同樣,模型將默認生成到項目的models目錄下。若是你以爲不爽,能夠用-a參數來自定義你想要存儲模型的子目錄。
sample_blog $ padrino g model post title:string body:text -a app => Located unlocked Gemfile for development create app/models/post.rb create test/models/post_test.rb create db/migrate/002_create_posts.rb
而後在遷移中給博文模型增長一個時間戳:
# 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
而後遷移到數據庫:
sample_blog $ padrino rake ar:migrate => Executing Rake ar:migrate ... == CreatePosts: migrating ==================================================== -- create_table("posts", {}) == CreatePosts: migrated (0.0016s) ===========================================
博文模型便建立好了。而後來建立提供基本展現功能的控制器:
sample_blog $ padrino g controller posts get:index get:show
=> Located unlocked Gemfile for development create app/controllers/posts.rb create app/helpers/posts_helper.rb create app/views/posts create test/controllers/posts_controller_test.rb
咱們再來添加一些標準路由到控制器裏面,好比:index和:show神馬的:
# 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
上面這個控制器定義了能夠經過咱們的應用來訪問的路由。聲明以Http方法get開始,接上一個符號表示動做(Action),放置在一個保存了獲取必要對象的變量以及輸出視圖模板的代碼塊當中。看上去跟Rails和Sinatra沒啥兩樣,是吧?(博主:好像是吧……)
下一步,爲index和show控制器動做分別建立視圖:
# 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) + '之前' .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) + '之前' .body= simple_format(@post.body) %p= link_to '顯式所有博文', url_for(:posts, :index)
Padrino管理系統使得數據記錄的增刪改查至關簡便自動。經過Padrino管理系統管理博文,只需輸入下面這行命令:
sample_blog $ padrino g admin_page post
=> Located unlocked Gemfile for development create admin/controllers/posts.rb create admin/views/posts/_form.haml create admin/views/posts/edit.haml create admin/views/posts/index.haml create admin/views/posts/new.haml inject admin/app.rb
你沒關Padrino服務器吧(CTRL + C)?沒關就好,來看看管理界面。
用你以前輸入的郵箱和密碼登陸http://localhost:3000/admin。
你能夠看到有兩個Tab,一個是博文,另外一個是帳戶。點擊博文那個分頁。
只需輕輕點擊一下「New」,你即可以開始建立新的記錄,頁面會羅列出你先前在建立博文模型時設置的全部字段。
注意:確保在建立模型和遷移後運行padrino g admin_page命令。
如今你已經經過管理界面添加了一些博文,訪問http://localhost:3000/posts並注意到你建立的博文都會在index動做中顯示出來。
你能夠經過padrino rake routes命令來顯示當前全部定義過的路由:
$ padrino rake routes
URL REQUEST PATH
(:about) GET /about_us (:posts, :index) GET /posts (:posts, :show) GET /posts/show/:id
這對理解控制器和url之間的映射關係頗有幫助哦!
至此,博文尚未關聯上做者信息,這像什麼話,不行不行!再來看看博文模型,咱們將開始經過增長新的遷移來將做者帳戶添加到博文中:
sample_blog $ padrino g migration AddAccountToPost account_id:integer
=> Located unlocked Gemfile for development create db/migrate/003_add_account_to_post.rb
上述指令建立了一個包含了指望字段的遷移,將account_id附加到博文中。
修改一下遷移文件,將現有博文都指派給系統的第一位用戶(如今也就一個用戶噻):
# db/migrate/003_add_account_to_post.rb class AddAccountToPost < ActiveRecord::Migration def self.up change_table :posts do |t| t.integer :account_id end # and assigns a user to all existing posts first_account = Account.first Post.all.each { |p| p.update_attribute(:account, first_account) } end # ... end
如今,咱們回到博文模型來建立帳戶關聯並增長點兒驗證:
# app/models/post.rb class Post < ActiveRecord::Base belongs_to :account validates_presence_of :title validates_presence_of :body end
親,每次修改數據庫都要記得遷移人家哦:
sample_blog $ padrino rake ar:migrate == AddAccountToPost: migrating =============================================== -- change_table(:posts) == AddAccountToPost: migrated (0.0009s) ====================================== 7:04 => Executing Rake ar:migrate ...
咱們的博文如今已經有了適當的關聯和驗證,接下來咱們須要進入Padrino管理系統作一點兒改動來包含帳戶和博文。
直奔admin/controllers/posts.rb,將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] = '恭喜,博文已成功建立!' redirect url(:posts, :edit, :id => @post.id) else render 'posts/new' end end # ... end
同時還要更新博文的視圖來顯示做者信息和其它改動:
# 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 '查看所有博文', 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 由#{post.account.email}發佈
如今來增長一個新用戶。到http://localhost:3000/admin,切換到Account分頁並建立一條新的帳戶記錄。一旦你有了新的帳戶,嘗試用它登陸並添加一些新的博文。猜猜這樣會發生什麼?這樣你就有了多個用戶和多篇博文:D
到http://localhost:3000/posts看看效果,博文和做者分別全都連接上了。
如今,應用已經正確配置而且服務器也跑起來了,咱們繼續來建立一些基本的樣式和佈局。
首先,咱們爲應用建立一個佈局。佈局是在其路由上扮演內容模板容器角色的文件,它會被用來爲應用建立各個結構一致的頁面。要想建立佈局,只須要簡單地想app/views/layouts目錄添加文件:
# app/views/layouts/application.haml !!! Strict %html %head %title= [@title, "Padrino 示例博客"].compact.join(" | ") = stylesheet_link_tag 'reset', 'application' = javascript_include_tag 'jquery', 'application' = yield_content :include %body #header %h1 Sample Padrino Blog %ul.menu %li= link_to '博客', url_for(:posts, :index) %li= link_to '關於', url_for(:about) #container #main= yield #sidebar - form_tag url_for(:posts, :index), :method => 'get' do Search for: = text_field_tag 'query', :value => params[:query] = submit_tag 'Search' %p Recent Posts %ul.bulleted %li Item 1 - Lorem ipsum dolorum itsum estem %li Item 2 - Lorem ipsum dolorum itsum estem %li Item 3 - Lorem ipsum dolorum itsum estem %p Categories %ul.bulleted %li Item 1 - Lorem ipsum dolorum itsum estem %li Item 2 - Lorem ipsum dolorum itsum estem %li Item 3 - Lorem ipsum dolorum itsum estem %p Latest Comments %ul.bulleted %li Item 1 - Lorem ipsum dolorum itsum estem %li Item 2 - Lorem ipsum dolorum itsum estem %li Item 3 - Lorem ipsum dolorum itsum estem #footer Copyright (c) 2009-2013 Padrino
這個佈局爲博客建立了一個基本結構,並引用了對控制行爲和顯示而言必要的樣式表和JavaScript文件。這個佈局應該包含一些假元素,好比假的搜索框和列表項。
而後,咱們僅僅須要爲演示創建兩張樣式表。第一張是被艾裏克·邁耶斯(Eric Meyers)重置的通用CSS,能夠在示例博客倉庫找到完整的樣式表重置並放到public/stylesheets/reset.css。
第二張是爲了博客更酷一點兒的應用樣式表,能夠從示例博客倉庫找到該樣式表的完整內容並放置到app/stylesheets/application.sass。
有了佈局和樣式表,博客終於拿得出手了!讓咱們訪問http://localhost:3000/posts來看看新的界面。
在部署應用之前,是否是還漏了點兒啥?對,RSS和Atom訂閱。只准用戶說他不想看,不許他他看不到!要實現訂閱,咱們得在博文控制器中爲index塊添加一個provides選項。下面的代碼指定路由須要響應的HTML、RSS和Atom格式:
# app/controllers/posts.rb SampleBlog.controllers :posts do ... get :index, :provides => [:html, :rss, :atom] do @posts = Post.all(:order => 'created_at desc') render 'posts/index' end ... end
須要注意的是,這條路由同時也指定渲染引擎(rendering engine)在使用RSS或Atom格式時避免輸出。
回到index.haml文件,咱們將採用auto_discovery_link_tag幫助方法來生成RSS訂閱引用建立器(the RSS feed using builder)。
# app/views/posts/index.haml - @title = "歡迎" - content_for :include do = feed_tag(:rss, url(:posts, :index, :format => :rss),:title => "RSS") = feed_tag(:atom, url(:posts, :index, :format => :atom),:title => "ATOM") #posts= partial 'posts/post', :collection => @posts
而後添加Atom引用建立器模板:
# app/views/posts/index.atom.builder xml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do xml.title "Padrino 示例博客" xml.link "rel" => "self", "href" => url_for(:posts, :index) xml.id url_for(:posts, :index) xml.updated @posts.first.updated_at.strftime "%Y-%m-%dT%H:%M:%SZ" if @posts.any? xml.author { xml.name "Padrino Team" } @posts.each do |post| xml.entry do xml.title post.title xml.link "rel" => "alternate", "href" => url_for(:posts, :show, :id => post) xml.id url_for(:posts, :show, :id => post) xml.updated post.updated_at.strftime "%Y-%m-%dT%H:%M:%SZ" xml.author { xml.name post.account.email } xml.summary post.body end end end
還有RSS引用建立器的模板:
# app/views/posts/index.rss.builder xml.instruct! xml.rss "version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/" do xml.channel do xml.title "Padrino Blog" xml.description "The fantastic padrino sample blog" xml.link url_for(:posts, :index) for post in @posts xml.item do xml.title post.title xml.description post.body xml.pubDate post.created_at.to_s(:rfc822) xml.link url_for(:posts, :show, :id => post) end end end end
檢查一下改動,看看http://localhost:3000/posts是否是已經提供了RSS和Atom訂閱。是的,對吧?那就能夠開張啦!
醜媳婦終於要見公婆了!用Heroku服務神馬的來部署Padrino應用最簡單老。
參照《Heroku快速入門指南》,確認你此時已經安裝了Git並創建了Heroku帳戶以及安裝了Heroku gem。
要部署到Heroku,須要先將應用建立爲Git倉庫:
sample_blog $ git init
sample_blog $ git add .
sample_blog $ git commit -m "initial commit for app"
以上命令是在初始化Git倉庫,並將全部內容都提交進去。而後將應用建立到Heroku:
sample-blog $ heroku create --stack bamboo-ree-1.8.7 sample-blog $ git push heroku master
歐了,你的應用如今就運行在Heroku上了!
運行heroku open命令能夠在你的系統默認瀏覽器裏打開網站。
眼目前兒,Padrino默認使用SQLite,但Heroku只認PostgreSQL,咋整?只能將pg添加爲依賴項囉:
# Gemfile group :production do gem 'pg' end
執行下面的命令能夠避免在你本地計算機上安裝pg gem:
sample-blog $ bundle install --without production
並且有必要爲生產配置一下config/database.rb:
# config/database.rb postgres = URI.parse(ENV['DATABASE_URL'] || '') ActiveRecord::Base.configurations[:production] = { :adapter => 'postgresql', :encoding => 'utf8', :database => postgres.path[1..-1], :username => postgres.user, :password => postgres.password, :host => postgres.host }
將Rakefile改成:
# Rakefile require File.dirname(__FILE__) + '/config/boot.rb' require 'thor' require 'padrino-core/cli/rake' PadrinoTasks.init
最後還得調整一下seed.rb:
# db/seeds.rb email = "info@padrinorb.com" password = "admin" shell.say "" account = Account.create(:email => email, :name => "Foo", :surname => "Bar", :password => password, :password_confirmation => password, :role => "admin") if account.valid? shell.say "=================================================================" shell.say "Account has been successfully created, now you can login with:" shell.say "=================================================================" shell.say " email: #{email}" shell.say " password: #{password}" shell.say "=================================================================" else shell.say "Sorry but some thing went worng!" shell.say "" account.errors.full_messages.each { |m| shell.say " - #{m}" } end shell.say ""
上面seed的值你想咋改就咋改,誰也攔不住的。
而後在終端中運行下面的命令:
sample_blog $ git add .
sample_blog $ git commit -m "Added Postgres support" sample_blog $ git push heroku master
再執行migrations/seeds:
sample_blog $ heroku run rake ar:migrate sample_blog $ heroku run rake seed
噹噹噹當,你就看到了:
sample_blog $ heroku run rake ar:migrate (in /disk1/home/slugs/151491_a295681_03f1/mnt) => Located locked Gemfile for production == CreateAccounts: migrating ================================================= -- create_table("accounts", {}) -> 0.0185s == CreateAccounts: migrated (0.0229s) ======================================== == CreatePosts: migrating ==================================================== -- create_table("posts", {}) -> 0.0178s == CreatePosts: migrated (0.0218s) =========================================== == AddAccountToPost: migrating =============================================== -- change_table(:posts) -> 0.0026s == AddAccountToPost: migrated (0.0028s) ====================================== MacBook:sample_blog DAddYE$ heroku rake seed (in /disk1/home/slugs/151491_7576c59_03f1/mnt) => Located locked Gemfile for production ================================================================= Account has been successfully created, now you can login with: ================================================================= email: info@padrinorb.com password: admin =================================================================
而後就能夠打開咱們部署的應用了:
sample_blog $ heroku open
go!