- 浏览: 170749 次
- 性别:
- 来自: 广州
-
最新评论
-
dongxuef:
正奇怪呢,原来你也没深究.源码中_params被default ...
在Rails的controller中访问params的一个小细节 -
sunsonavaj:
Rails 3 下自定义错误信息显示页面 -
Hooopo:
Thx!
ubuntu下让netbeans的字体变得好看些 -
ybffnst:
paperclip 对错误消息的处理是对字符串进行处理的,不支 ...
如何自定义处理ActiveRecord中的errors信息 -
wozhidao:
这个方法有个很大的bug,远程图片的时候是取不到扩展名的,上传 ...
paperclip定制文件名
一个基于Sinatra的小程序
前些天有一个需求,需要写一个小程序来收集用户的Email,非常的简单:
1.一个用户输入Email的界面
2.提交Email表单后,提示用户已经记录了他/她的Email,然后跳转到首页.
这是一个简单得不能再简单的小功能了,但是由于这个功能是要求放在一个独立的服务器上的,跟现有的项目也毫不相干的,我并不想在现有的Rails项目中增加这个功能.我首先想到的是新建一个Rails项目实现这个功能,动手之前我又犹豫了,这么一个简单的东西,要如此大动干戈么?
为什么说是大动干戈呢?Rails是一个全能的Web框架,提供了许多方便快捷的功能,也正是因此而凌驾于基本Web开发框架之上,但是对于这么一个简单的需求,Rails超强的功能反而成了累赘,根本就用不着啊,杀鸡用牛刀就是形容这个的.
直观地说,就是我不想为了记录一下用户的Email,就要安装Rails gem,要建立数个毫无用处的文件夹,要上传数个不相干的文件,我就是想快速简单地解决这事.
于是我想起了前些日子才发布了1.0版本的Sinatra,在些之前我对Sinatra的了解就是知道很小(好像只有250KB),和看过一些示例的代码片段.
上面说了这么多,仅仅是为了点题:Sinatra:Rails的有益补充.
使用某种技术之前一定要先看官方的文档,再Google一下资料,这种有益的习惯我一直都有保持
安装:
以下是这个叫做contacts小程序的代码结构:
email.rb是一个ActiveRecord对象,跟在Rails中一样是个普通人,跟Sinatra半毛钱的关系都没有.
emails表的建表sql:
跟Sinatra有关系的是app.rb,这也是程序的主文件了(没错,就这么一个,当然是因为功能太简单的,但是如果太复杂的话,我直接用Rails去了)
app.rb的代码跟你看到的Singtra的示例代码简直就是一模一样的.
咱们看看views:
至此,这个程序已经算是完成了,可以这样启动应用程序:
细心的同学会发现上面的代码结构中还有一个 config.ru 文件,看到.ru后缀就知道是 Rack 来袭了.没错, config.ru 是用来配置在支持Rack接口的服务器中运行这个小程序的,我用的是 Nginx + Passenger.
贴上我在 nginx.conf 中的配置:
这个Sinatra的小程序相当简单,也没什么技术含量,但是它确实解决了我的问题,简单而优雅.
我觉得Sinatra提供了一个Web框架的最基本的东西,可以非常快速地解决一些小需求,我并没做做压力测试之类的,但是我相信Sinatra的速度肯定是比Rails快的,只要看看Rails堆栈里那一堆的Rack中间件,你就明白我为什么这样说了.当然Rails从来都不是速度取胜的
我也不觉得Sinatra可以和Rails争一日之长短,它提供的功能太简单,开发稍微复杂的项目,肯定是要自己写很多东西的,而这些Rails早已经为你准备好了.但是当你有一些小需求(比如像我上面写的这种),Sinatra就非常适合了.
快速而小巧,还有比这更能俘虏懒惰程序员的心么?
我不愿意用"简单"这个词来形容Sinatra,我更加愿意用"简洁"来形容它.
Sinatra:一个可以作为Rails的有益补充的框架.
简洁而不简单!
参考:
官方网站: http://www.sinatrarb.com/
The Sinatra Book: http://sinatra-book.gittr.com/
一些在Nginx + Passenger下部署Sinatra的链接:
http://stackoverflow.com/questions/2321314/multiple-rack-apps-on-nginx-passenger-one-as-root-the-other-not-config-help
http://tommy.chheng.com/index.php/2009/06/deploying-a-sinatra-app-on-nginx-passenger-with-capistrano-and-git/
http://www.iteye.com/topic/605707
前些天有一个需求,需要写一个小程序来收集用户的Email,非常的简单:
1.一个用户输入Email的界面
2.提交Email表单后,提示用户已经记录了他/她的Email,然后跳转到首页.
这是一个简单得不能再简单的小功能了,但是由于这个功能是要求放在一个独立的服务器上的,跟现有的项目也毫不相干的,我并不想在现有的Rails项目中增加这个功能.我首先想到的是新建一个Rails项目实现这个功能,动手之前我又犹豫了,这么一个简单的东西,要如此大动干戈么?
为什么说是大动干戈呢?Rails是一个全能的Web框架,提供了许多方便快捷的功能,也正是因此而凌驾于基本Web开发框架之上,但是对于这么一个简单的需求,Rails超强的功能反而成了累赘,根本就用不着啊,杀鸡用牛刀就是形容这个的.
直观地说,就是我不想为了记录一下用户的Email,就要安装Rails gem,要建立数个毫无用处的文件夹,要上传数个不相干的文件,我就是想快速简单地解决这事.
于是我想起了前些日子才发布了1.0版本的Sinatra,在些之前我对Sinatra的了解就是知道很小(好像只有250KB),和看过一些示例的代码片段.
上面说了这么多,仅仅是为了点题:Sinatra:Rails的有益补充.
使用某种技术之前一定要先看官方的文档,再Google一下资料,这种有益的习惯我一直都有保持

安装:
# 安装Sinatra gem install sinatra #安装Rails的ActiveRecord,因为用Ruby操作数据库,除了直接写Sql外,我就会ActiveRecord,bty:我已经不在代码中直接写sql很多年了. gem install activerecord v=2.3.5
以下是这个叫做contacts小程序的代码结构:
|-contacts |-views |-index.erb |-success.erb |-app.rb |-config.ru |-email.rb
email.rb是一个ActiveRecord对象,跟在Rails中一样是个普通人,跟Sinatra半毛钱的关系都没有.
emails表的建表sql:
create table emails (id int(11) primary key AUTO_INCREMENT,email varchar(255) not null,created_at datetime)
require 'rubygems' #这一句必不可少,如果你用的是Ruby 1.9.x,可以把这句删掉 gem 'activerecord','2.3.5' require 'activerecord' # 在这里为了方便,我直接把数据库的连接设置写在里面了. ActiveRecord::Base.establish_connection( :adapter => "mysql", :encode => 'utf8', :host => "localhost", :username => "root", :password => "12345678", :database => "contacts" ) class Email < ActiveRecord::Base validates_presence_of :email validates_format_of :email,:with => /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i end
跟Sinatra有关系的是app.rb,这也是程序的主文件了(没错,就这么一个,当然是因为功能太简单的,但是如果太复杂的话,我直接用Rails去了)
app.rb的代码跟你看到的Singtra的示例代码简直就是一模一样的.
require 'rubygems' require 'sinatra' require File.join(File.dirname(__FILE__),'email') #处理get请求,匹配的url是这样的: http://www.yourdomain.com/ get '/' do erb :index #用erb渲染 views/index.erb 文件 # 注: Sinatra中默认的网页文件都是放在根目录下的views目录中,但是可以配置,我就不折腾了. end # 处理http://www.yourdomain.com/contact,注意了,是post方法哦 post '/contact' do #下面这两句是不是很熟悉啊:) email = Email.new :email => params[:email],:created_at => Time.now email.save erb :success end
咱们看看views:
# views/index.erb <!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> <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" /> <title>Wellcome to DiginDigin.com</title> </head> <body> <div style="text-align:center;margin:100px auto;"> <h2>Email</h2> <form action="/contact" method="post"> <input name="email" type="text" /> <input type="submit" value="Submit" /> </form> </div> </body> </html> # views/success.erb <!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> <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" /> <title>Wellcome</title> <meta http-equiv="refresh" content="5;http://www.yourdomain.com" /> </head> <body> <div style="text-align:center;margin:100px auto;"> <h2>欢迎加入,敬请期待</h2> <p>5秒后,自动跳转到我们的首页</p> </div> </body> </html>
至此,这个程序已经算是完成了,可以这样启动应用程序:
cd contacts ruby app.rb #默认启动的话,监听的是4567端口,可以在浏览器输入 http://localhost:4567 访问 #也可以用 p 选项指定端口 ruby app.rb -p 8000
细心的同学会发现上面的代码结构中还有一个 config.ru 文件,看到.ru后缀就知道是 Rack 来袭了.没错, config.ru 是用来配置在支持Rack接口的服务器中运行这个小程序的,我用的是 Nginx + Passenger.
require 'rubygems' require 'sinatra' set :env,:production disable :run require 'app' # 在Sinatra的示例文档中是这样的: run Sinatra.application,但这样会报错的,修改后如下,正确启动. run Sinatra::Application
贴上我在 nginx.conf 中的配置:
http { passenger_root /usr/local/ruby-enterprise-1.8.7/lib/ruby/gems/1.8/gems/passenger-2.2.3; passenger_ruby /usr/local/ruby-enterprise-1.8.7/bin/ruby; server { listen 80; server_name localhost; passenger_enabled on; location / { root /dev/contacts; } } }
这个Sinatra的小程序相当简单,也没什么技术含量,但是它确实解决了我的问题,简单而优雅.
我觉得Sinatra提供了一个Web框架的最基本的东西,可以非常快速地解决一些小需求,我并没做做压力测试之类的,但是我相信Sinatra的速度肯定是比Rails快的,只要看看Rails堆栈里那一堆的Rack中间件,你就明白我为什么这样说了.当然Rails从来都不是速度取胜的

我也不觉得Sinatra可以和Rails争一日之长短,它提供的功能太简单,开发稍微复杂的项目,肯定是要自己写很多东西的,而这些Rails早已经为你准备好了.但是当你有一些小需求(比如像我上面写的这种),Sinatra就非常适合了.
快速而小巧,还有比这更能俘虏懒惰程序员的心么?
我不愿意用"简单"这个词来形容Sinatra,我更加愿意用"简洁"来形容它.
Sinatra:一个可以作为Rails的有益补充的框架.
简洁而不简单!
参考:
官方网站: http://www.sinatrarb.com/
The Sinatra Book: http://sinatra-book.gittr.com/
一些在Nginx + Passenger下部署Sinatra的链接:
http://stackoverflow.com/questions/2321314/multiple-rack-apps-on-nginx-passenger-one-as-root-the-other-not-config-help
http://tommy.chheng.com/index.php/2009/06/deploying-a-sinatra-app-on-nginx-passenger-with-capistrano-and-git/
评论
5 楼
fireflyman
2010-07-22
yangzhihuan 写道
@Hooopo 说起来我还真没有写过Rack的程序呢,之前看过很多Rack的资料,对Rack的原理一知半解,可是你让我写一个Rack,一时之间还真不知道如何下手。
你的Rack程序比我用Sinatra要简洁得多
你的Rack程序比我用Sinatra要简洁得多

http://www.iteye.com/topic/605707
4 楼
yangzhihuan
2010-07-08
@Hooopo 说起来我还真没有写过Rack的程序呢,之前看过很多Rack的资料,对Rack的原理一知半解,可是你让我写一个Rack,一时之间还真不知道如何下手。
你的Rack程序比我用Sinatra要简洁得多
你的Rack程序比我用Sinatra要简洁得多

3 楼
robertpi
2010-04-20
不错,有意思
2 楼
fireflyman
2010-04-05
为啥要把虎跑加进去啊....
1 楼
Hooopo
2010-04-05
既然是这么简单的事情,用rack写也比较有趣:
一共5个文件,views里面和搂主的一样:
app.rb
config.yml
运行:
模仿rails写了一个简单的console:
console
运行console:
一共5个文件,views里面和搂主的一样:
hooopo@x-hooopo:~/contact$ ls app.rb config.yml console views
app.rb
#!/usr/bin/env ruby require "rubygems" require "rack" require "yaml" require "logger" require 'active_record' config = YAML::load(File.open(File.dirname(__FILE__) + "/config.yml")) ActiveRecord::Base.establish_connection(config) class Email < ActiveRecord::Base validates_presence_of :email validates_format_of :email,:with => /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i end def process_request(env) request = Rack::Request.new(env) if request.post? Email.create! :email => request.params["email"] rescue return "Email Format Error!" File.read("views/success.html") else "invalide request!" end end builder = Rack::Builder.new do use Rack::CommonLogger, Logger.new("/var/log/rack.log") use Rack::ContentType, "text/html" use Rack::ContentLength map "/" do run lambda{|env| [200, {}, File.read("views/index.html")]} end map "/contact" do run lambda{|env| [200, {}, process_request(env)]} end end Rack::Handler::Mongrel.run builder, :Port => 8080
config.yml
adapter: mysql encode: utf8 host: localhost username: root password: ****** database: contacts
运行:
sudo chmod +x ./* ./app.rb
模仿rails写了一个简单的console:
console
#!/usr/bin/env ruby require 'rubygems' require 'yaml' require 'active_record' require 'irb' require 'irb/completion' config = YAML::load(File.open(File.dirname(__FILE__) + "/config.yml")) ActiveRecord::Base.establish_connection(config) class Email < ActiveRecord::Base end IRB.start
运行console:
hooopo@x-hooopo:~/contact$ ./console Irbrc Loading... >> enable_hirb => true >> Email.all +----+-------------------+--------------------------------+ | id | email | created_at | +----+-------------------+--------------------------------+ | 1 | hoooopo@gmail.com | Sun Apr 04 22:44:46 +0800 2010 | | 2 | hooopo@gmail.com | Sun Apr 04 22:58:56 +0800 2010 | +----+-------------------+--------------------------------+ 2 rows in set >>
发表评论
-
Rails 2.3.12下遇到的named route的诡异问题
2011-08-14 21:18 1695周五的时候把网站升级到Rails 2.3.12,本来在本地测试 ... -
ActionMailer的一些配置
2011-08-14 20:59 1714一般情况下,如果你使用gmail的话,都是这样配置的: A ... -
如何自定义处理ActiveRecord中的errors信息
2011-07-26 23:33 2950今天写代码的时候,客服MM向我反馈了一个问题,这个问题本身是很 ... -
Rails 3 下自定义错误信息显示页面
2010-07-08 15:21 3817大家都知道想在Rails下自定义错误显示的页面是修改 resc ... -
paperclip定制文件名
2010-07-02 14:25 3424在新项目中使用了paperclip这个文件上传插件,一切都很满 ... -
require特定版本的gem
2010-03-31 21:07 2608今天有一个需求要单独地使用ActiveRecord,但是我的机 ... -
从Rails 2.3.5 升级到 Rails 3.0 beta
2010-03-27 22:12 2225因为有一个新的项目打算使用Rails 3.0 beta,所以先 ... -
命名时请留意Rails下的关键字
2010-01-22 17:36 2109前些天我在做一个支付集成的接口,对方返回的结果串里面有一个 e ... -
rails下自定义出错页面
2010-01-22 17:17 2400rails出错的时候,一般都是跳转到错误跟踪的页面下,这样在开 ... -
rails下修改http头(http header)
2010-01-22 17:08 5224其实就是修改response中一个叫做headers的Hash ... -
在Rails的controller中访问params的一个小细节
2009-12-02 22:36 7328大家都知道controller中的params其实是一个Has ... -
Rails开发工具之Vim
2009-10-19 16:06 12453学习和开发Ruby & Rails ... -
Thinking Sphinx + Coreseek + rmmseg的安装与使用
2009-10-06 23:48 3843要在Rails上使用全文检索,选择一直不多,以前我一直是使用F ... -
Migrations流水帐
2009-07-11 16:02 1354对于Rails的迁移功能Migrations,一直都只是看一下 ... -
重新安装ruby遇到的问题
2009-06-13 13:14 1346昨天重装了操作系统,要重新安装ruby环境. 因为以前 ... -
JRuby使用经验
2009-05-10 17:06 2028首先我是一个Java程序员 ... -
使用ri查看Rails的API
2009-03-25 23:31 4506我一直都比较习惯直接到 http://www.ruby-doc ... -
Ubuntu Linux下ruby 1.9.1和Rails 2.3升级记录
2009-03-22 00:22 4499安装 ... -
今晚用上了ruby的动态方法调用,open class和mixin三大神器
2009-01-12 00:43 2261今晚人品爆发,一举用上了ruby的动态方法调用,open cl ... -
让rails中多态关联的方法名更加人性化
2008-12-02 22:55 2465rails中的多态关联功能,很好很强大。 但是多态关联的方法 ...
相关推荐
Sinatra是一个轻量级、基于Ruby的微型框架,用于快速开发简洁而优雅的Web应用。它允许开发者用简单的DSL(领域特定语言)来定义路由、处理HTTP请求和响应。 首先,让我们深入理解Ruby。Ruby是一种面向对象的编程...
主要内容涵盖单选题和操作题两大部分。单选题涉及openGauss数据库的基本概念、数据模型、SQL语法、事务管理和用户权限等方面的知识点。操作题则围绕一个名为bookdb的图书购买信息数据库展开,具体任务包括插入图书信息、更新顾客信息、删除购买记录、查询特定图书信息以及创建视图、存储过程和触发器等实际操作。每道题目均附带详细的解题步骤和最终答案。
新建 Microsoft Word 文档 (9).docx
Delphi 12.3控件之nrCommLib Pro v9.54 Full Source for D10.3-D12.7z
内容概要:本文详细介绍了使用三菱PLC FX5U控制四轴伺服系统的全过程,涵盖硬件配置、电气接线、参数设置以及运动控制逻辑。硬件方面,选用三菱FX5U-64MT作为主控制器,搭配四个MR-JE-20A伺服驱动器和其他必要组件。软件部分则深入探讨了轴参数初始化、原点回归、多轴联动、HMI界面设计及报警处理等关键技术环节。特别针对旋转轴的特殊处理进行了详细说明,如双速原点回归、绝对定位指令的应用等。此外,还提供了调试经验和优化技巧,确保系统的高精度和平稳运行。 适合人群:从事自动化控制系统设计、调试的技术人员,尤其是对三菱PLC和伺服系统有一定了解的研发人员。 使用场景及目标:适用于工业自动化领域的四轴伺服控制系统开发,旨在帮助工程师掌握从硬件选型到软件编程的一整套解决方案,提高项目的成功率和技术水平。 其他说明:文中附有多份参考资料,包括完整的程序文件、界面工程、CAD接线图和伺服参数清单,便于读者进行实际操作和验证。
分阶段学习:先掌握基础,再深入细分领域。 理论与实践结合:学完算法后立刻用代码实现。 保持持续学习:AI技术迭代快,需跟踪最新进展。
电子硬件课程设计
Java项目基于ssm框架的课程设计,包含LW+ppt
脚本-压测相关-zyx编写
Java项目基于ssm框架的课程设计,包含LW+ppt
app.mobileconfig
内容概要:本文详细介绍了使用MotorCAD进行2极12槽永磁直流有刷电机的设计与优化方法。首先,通过Python脚本设置电机的基本参数,如外径、轴向长度、额定转速等。接着,深入探讨了磁钢选型、绕组设置、电磁仿真、热分析等多个关键技术环节。针对常见的设计难题,如齿槽转矩、磁钢充磁方向、绕组跨距等提供了具体的解决方案。同时,还分享了一些提高仿真精度和优化性能的实用技巧,如参数扫描、FEA计算、热管理等。最后,通过实测数据分析验证了设计方案的有效性。 适合人群:电机设计工程师、高校相关专业师生、对电机设计感兴趣的开发者。 使用场景及目标:适用于需要精确设计和优化小型永磁直流有刷电机的场合,帮助用户掌握MotorCAD的具体应用,提高设计效率和产品质量。 其他说明:文中提供的Python和VB脚本示例有助于自动化参数设置和批量处理任务,减少重复劳动。此外,还强调了在设计过程中需要注意的关键技术和常见陷阱,确保设计方案的可行性和可靠性。
内容概要:本文详细介绍了三相逆变器在MATLAB/Simulink环境下的PI闭环控制及解耦控制的实现方法。首先,通过坐标变换将三相电流从静止坐标系转换到旋转坐标系,确保功率守恒并实时更新转子位置角。接着,实现了带有抗饱和处理的PI控制器,防止积分风-up现象。然后,针对d轴和q轴之间的耦合问题,引入了解耦控制,通过低通滤波和交叉耦合项来稳定系统。此外,还讨论了PWM生成模块的死区时间和仿真结果的验证方法,强调了参数调试的重要性和具体策略。 适合人群:电力电子工程师、自动化控制领域的研究人员以及对三相逆变器控制感兴趣的高校师生。 使用场景及目标:适用于需要深入了解三相逆变器控制原理和技术实现的研究项目或工程应用。主要目标是掌握PI控制器的设计、解耦控制的应用及其在MATLAB/Simulink中的仿真实现。 其他说明:文中提供了详细的代码示例和调试技巧,帮助读者更好地理解和实践相关理论。同时提醒读者,仿真成功并不代表实际硬件运行无误,建议在实验过程中准备必要的保护措施。
58面经面试过程和题目.txt
OceanBase OBCP 实验指导手册V1.3
内容概要:本文详细介绍了ABB喷涂机器人IRC5P与PLC通过Profinet通讯进行程序号启动的具体步骤和注意事项。主要内容涵盖Profinet通讯的基本配置,包括设备名称、IP地址设置,RAPID代码编写,任务声明,信号映射,以及调试技巧。文中还分享了许多实际调试中的经验和常见错误,如大小写敏感、IP地址分配、程序号有效性和信号防抖处理等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是负责机器人与PLC通讯配置的技术人员。 使用场景及目标:帮助技术人员正确配置ABB喷涂机器人IRC5P与PLC之间的Profinet通讯,确保程序号能够顺利启动,避免常见的配置错误和调试难题。 其他说明:文章强调了硬件和软件配置相结合的重要性,并提供了详细的代码示例和调试建议,有助于提高系统的稳定性和可靠性。
电子硬件课后习题题目及要求.docx
亲测开源好用的红盟云发卡源码对接支付宝等支持一件搭建,方便建立自己的发卡平台,源码全部开源无加密,可方便而开使用。 测试环境:php7.2+mysql+宝塔面板 安装教程: ①设置public运行目录 ②设置thinkphp伪静态 ③访问域名填写数据库信息根据提示安装
Delphi 12.3控件之MiTeC_System_Information_Component_Suite_15.1.0_Full_Source.7z
Delphi 12.3控件之StyleControls 5.80.7z