10年前,Java业界有着三大框架————Struts,Spring,Hibernate.时光飞逝,当年风靡一时的技术慢慢淡出了人们的视野,Spring MVC,Mybatis等技术开始大行其道,然而,这都不是重点,作为一个非Java技术圈的程序喵,今天要讨论的主题缺失Ruby中的三大框架。
Ruby也有三大框架?
Ruby确实不像Java那样,声名显赫,三大框架互相配合,天衣无缝。Because We Only Need One Fullstack Framework————Rails! 嗯,全栈框架Rails的推出,颠覆性地改变了Web开发界。本次我们就来Discuss一下Ruby中的几个框架。
Ruby Basic
首先还是介绍一下Ruby,简单的说Ruby具有如下几个特点:
-
动态语言
所谓动态语言是指语言数据类型可以动态改变,类型非常灵活,代表是PHP,Ruby,Python,JavaScript等脚本语言;与之相对的,Java、C++、C#等都是静态语言。动态语言的特点就是简单、灵活、多变、容易开发。
-
完全面向对象
Ruby的对象系统借鉴了Smalltalk的对象系统,具有完全面向对象的特点,在ruby中,类也是对象,对象本身也是对象。
-
函数化
Ruby的另一个原型是Lisp,甚至有人把Ruby比作是Lisp的一种现代方言。
-
元编程和DSL
正是由于以上几个特点,导致Ruby本身具有了强大的元编程和DSL能力。使用Ruby可以开发出非常奇特的程序和框架。
Ruby Code
下面来欣赏一段Ruby Code!
class Grade
def initialize
@dataStore = []
end
def add(score)
@dataStore.push(score)
end
def avg
sum = 0
@dataStore.each do |data|
sum = sum + data
end
avg = sum / @dataStore.length
return avg
end
end
该代码的功能是计算学生的平均分,使用面向对象技术构建,首先我们定义了一个类Grade,然后定义了构造函数initialize,在构造函数中,定义了一个实例变量@dataStore
,该变量是一个数组。随后定义了两个方法add和avg,分别用来添加分数、求平均分,在添加分数函数中,调用数组@dataStore的push方法将score加入数组,在求平均分函数中,利用迭代器取出dataStore数组中的每一个元素,然后将其加入sum当中,最后用sum/length求出平均数。
以下部分现在没时间,先不写了,以后有时间再补充,代码先放着。
Rails框架介绍
- 提到Ruby,人们首先会想到Ruby on Rails
- Rails是什么?
- Rails产生于2004年,是一个基于MVC的全栈Web开发框架,框架全部用ruby编写。
特点
-
三大要点:
- Ruby —— 语言(language)
- Gem —— 工具 (tools and library)
- Rails —— 平台 (platform)
-
两个基本原则
- DRY —— Don’t Repeat Yourself
- CoC —— Convention over Configuration
-
一分钟搭建好Rails网站框架
rails new "example_site"
bundle install
rails server
Sinatra框架介绍
Rails本来是轻量级框架,但是随着ruby和rails的发展,框架开始变的越来越复杂。在这种状态下,一个更轻量级的框架产生了,它就是Sinatra.Sinatra是一个超轻量级Web框架,源代码总共只有1000多行,具有强大的可配置性。Sinatra => Express.js
gem install sinatra
require 'sinatra'
require 'sinatra/reloader'
require 'active_record'
ActiveRecord::Base.establish_connection(
"adapter" => "sqlite3",
"database" => "./bbs.db"
)
class Comment < ActiveRecord::Base
end
get '/' do
@comments = Comment.order("id desc").all
erb :index
end
post '/new' do
Comment.create({:body => params[:body]})
redirect '/'
end
post '/delete' do
Comment.find(params[:id]).destroy
redirect '/'
end
<h1>BBS</h1>
<ul>
<% @comments.each do |comment| %>
<li data-id="<%= comment.id %>">
<%= comment.body %>
<span class="deleteCmd" style="cursor:pointer;color:blue">[x]</span>
</li>
<% end %>
</ul>
<h2>Add New</h2>
<form method="post" action="/new">
<input type="text" name="body">
<input type="submit" value="post!">
</form>
Grape框架介绍
-
产生目的:REST API > Web Site
-
一个微型框架,设计运行在Rack或配合Rails/Sinatra使用。
-
API支持一些常见约束,常用于向客户端提供数据。
-
代表作品:Gitlab
class API < Grape::API
prefix 'api'
version 'v0.1', using: :path
rescue_from ActiveRecord::RecordNotFound do |e|
Rack::Response.new({
error_code: 404,
error_message: e.message
}.to_json, 404).finish
end
rescue_from :all do |e|
Rack::Response.new({
error_code: 500,
error_message: e.message
}.to_json, 500).finish
end
mount Music::Store
add_swagger_documentation api_version:'v0.1', mount_path: "/docs", markdown:GrapeSwagger::Markdown::KramdownAdapter
end
class API < Grape::API
prefix 'api'
version 'v0.1', using: :path
rescue_from ActiveRecord::RecordNotFound do |e|
Rack::Response.new({
error_code: 404,
error_message: e.message
}.to_json, 404).finish
end
rescue_from :all do |e|
Rack::Response.new({
error_code: 500,
error_message: e.message
}.to_json, 500).finish
end
mount Music::Store
add_swagger_documentation api_version:'v0.1', mount_path: "/docs", markdown:GrapeSwagger::Markdown::KramdownAdapter
end