2008-07-05

Rails: 在MacBook上尝试Passenger(mod_rails)

关键字: rails macbook leopard passenger mod_rails
自打换了MacBook以后,安装前端web服务器不在像Ubuntu上那么简单,一个apt-get就轻松搞定,不过最新的Leopard自带了Apache,虽然我不喜欢Apache,不过因为是最容易得到且内置,并且一个非常有前途的项目Passenger(mod_rails)也开始支持Leopard内建的Apache了,所以决定用这一套组合来作开发. 关于Leopard内建的Apache请看这里 安装Passenger的步骤非常简单: # 安装gems sudo gem install passenger # 安装apache module并配置 sudo passenger-install-a ...
2008-06-06

Rails Tips: CSRF and authenciticy_token

关键字: rails tips csrf authenciticy_token
从Rails 2开始,默认使用cookie来保存session,于是很多关于安全上的置疑被频繁提及。尤其是cross-site request forgery(CSRF)攻击。 在Rails2中预防CSRF其实很容易,首先确保在application.rb中包含protect_from_forgery调用 class ApplicationController < ActionController::Base protect_from_forgery end 至此,所有用form_for或者form_tag等生成的表单均被隐藏注入一个特别的基于用户session生成的t ...
2008-06-03

Rails Tips: Rails docs with Jamis template

关键字: raild docs jamis tempate
我是懒人,文档上能查到的我从来不记,所以需要在自己的电脑上备一份Rails的文档随时备查。 我的屏幕分辨率是1280X800,传统的方式生成的rails文档看起来相当别扭,导航索引居然放在上方,对于宽屏查看文档尤其不合适,而Rails官方文档确做得很好。 实现很容易,记录步骤以备查: 首先到这里下载Jamis template模板文件,将模板放到rdoc的模板目录下 # 我的电脑上位置在 /usr/lib/ruby/1.8/rdoc/generators/template sudo cp jamis.rb /usr/lib/ruby/1.8/rdoc/generators/templ ...
2008-06-02

Ruby Tips: Tdiy xml

关键字: ruby xml tidy
最简单的Tidy Xml的方法,记录以备查: 举例,我有一个xml文件org.xml: <foo><bar>foobar</bar></foo> 我想Tidy并保存为tidy.xml: <foo> <bar> foobar </bar> </foo> 用REXML::Document来实现: require 'rexml/document' open('tidy.xml', 'w') do |out| REXML::Document.new(open('org.xml').read).writ ...
缘起: 最近开始应用BDD开发实践,刚刚开始我跟很多人一样,找不到北,用不来,在无数地方看到这篇介绍BDD的pdf文档,学习并了解BDD背后的基础知识中,就顺便翻下,我是个懒人...不懂的...难翻的...我统统放着不翻,"specification"这个词,按我自己理解翻译成"规范"有点词不达意,我更倾向于不翻,总之只要能够理解他是什么,我不在乎他应该翻译成什么. A NEW LOOK AT TEST-DRIVEN DEVELOPMENT Dave Astels dastels@daveastels.com The Problem 目前测试驱动开发(TDD)正如日中天,很多大公司耗费巨 ...
2008-04-30

关于rails/mysql的一二事

关键字: rails mysql
有的时候需要导入大量数据到数据库,还需要共享给团队中其他人,rails并没有提供一个最直接的途径来import数据,虽然有个db:fixtures:load但是不够灵活.且导出数据可能还需要自己手写一个rake task 我是一个懒人,喜欢最简单的办法,就直接写sql在migration脚本里面,execute执行,至于sql从哪里来?可以字符串拼接,可以从mysql中dump... 今天碰到一个问题,因为数据量大,migration script也较大,在另外一个人的mac上碰到"max_allowed_packet"错误,貌似是因为mac下mysql的max_allowed_packe ...
2008-03-22

Trick: Rails里的number_with_precision

关键字: ruby, rails, number_with_precision, number_to_currency
缘起: 很早以前碰到一个需求,实现一个四舍五入(round)的全局HelperMethod,并不难,写出来以后就放在哪里了.而Rails直接提供了一个number_to_currency方法可以方便的在rhtml中将数字显示为CurrencyString,问题来了helper.number_to_currency(1234567890.50) # => $1,234,567,890.50如果对这个数字31.825执行转换呢?helper.number_to_currency(31.825) #=> "$31.82"结果不对呀,应该是"$31.83&qu ...
2008-03-18

Trick: Ruby的二维数组

关键字: ruby, array, trick
 缘起: 昨天跟一个学习ruby的网友聊天,刚好二维数组,对方抛给我一个问题,是这样的: 创建一个含有3个元素的二维数组,并填充所有数组元素为'0'arr = Array.new(3, Array.new(3,0)) 然后改写一个二维数组中一个元素的数值arr[1][1] = 1 打印数组p arr 得到的结果是[[0, 1, 0], [0, 1, 0], [0, 1, 0]] 也就是说二维数组中每个sub array都被赋值 但是如果采用数组字面量方式创建爱昵一个二维数组arr = [[0, 0, 0], [0, ...
2008-03-16

Rails技巧: Handling nil in method calls

关键字: rails, nil
缘起:Martin在ruby-lang.org.cn发起了一个栏目"每日一题",非常有趣,第一期的两道题目中的第二题描述如下:我们在项目中经常遇到去关联对象的属性,而关联对象又经常为空,则需要做nil?的判断。譬如class Coment<AR belongs_to :user end class User<AR has_many :comments end 我们在使用的时候一般如下:unless @comment.user.nil? puts @comment.user.login end 想个方法简化他,去 ...
2008-03-14

ActiveScaffold.com.cn上线,祝贺曹维远兄

关键字: rails, activescaffold
记得第一次接触ActiveScaffold的时候刚好就是去年这个时候,当时作一个小项目,需要将svn repository中的所有条目都列举出来,于是不经意间找到了这个插件,限于当时的水平,以及对rails有限的了解,只用了这么一次就放下了.不过,是宝石总会发光的.第二次接触ActiveScaffold,正是在shanghaionrails第二次活动,听Forrest(曹兄)讲解这个,记得开始之时我心中存有诸多疑惑,但随着Forrest慢慢道出AS的精髓,已经完全覆盖了我心中的每个问题,那种感觉是真真正正的挠到了我的痒处,让我完全按奈不住想要跃跃欲试,于是第三天上班,我就开始尝试将AS引入正在 ...
2008-03-06

郁闷了今天,基础太重要了!

关键字: ruby, rails, collection, iterator
今天着实郁闷了一回,一个这么大的bug,愣是没有发现,直到新的核心功能上线一周以后才发现,这里我需要吼出来发泄一下: 郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了! 事情其实很简单,一个ruby的collection,对其进行each迭带的时候,不要尝试在其each block的迭带中不要作对collection内的元素进行条件判断,然后根据条件添加新的元素或者删除旧的又或者合并collection中的元素,这么作是不 ...
2008-02-29

ruby中的"+="操作符和"<<"操作符

关键字: ruby, 操作符, +=, <<
如果你有使用其他语言的习惯,在ruby中你可能会用"+="操作符来appanding字符串. >> str = "foo" => "foo" >> str += "bar" => "foobar" 但是我有充分的理由建议你用"<<"来appanding.也许你没有注意到,当执行"+="操作一个字符串时,你得到的结果其实是一个新创建的String实例来保存结果,但是"<<"操作将直接将在原来的字符串上appanding新字符串: >> str = "foo" => "foo" >> str.object_id => -606274188 >> s ...
2008-02-20

被Array.uniq!咬到

关键字: ruby, array, uniq!
Ruby Array的方法命名规则可以简单的这么理解: 将值存入先前分配的存储位置的过程常以"!"结尾 比如{map,map!},{flatten,flatten!},{reject,reject!} 我要说的是Array.uniq!方法 按照我的直觉理解,如果一个数组对象,调用uniq方法,返回一个新的且uniq过的数组对象 如果调用uniq!方法,那么将直接修改原来的数组对象,去除重复的数组元素 但是我发现我错了,ruby 1.8.6并不是这么理解 array.uniq! → array or nil Removes duplicate elements from self. R ...
2008-02-17

rails中的Float/Decimal数据类型

关键字: ruby, rails, float, decimal
在处理金额/税率/运费等跟钱有关的计算中,一般在数据库中用Float类型字段来存储数字. 众所周知,Float数据类型并不精确,但这个问题经常被我忽视,结果被这个问题给咬到一口. 在Ruby中,Float存储在有限的位中,而有限位不能存储无限位的循环小数. 在MySQL中,Float类型用于表示近似数值数据类型. 总而言之,浮点数不适合作精确比较! 问题是这样: 在MySQL中,一张名为shipping_rates的表,存储了Fedex在0~100(points)的各个区间段的运费价格,用来计算运费,比如产品是25points,那么可以在这张表中找到一条记录说,20.1~30points ...
2007-12-23

用rake task在console中访问数据库

关键字: rails,database,console
缘起:这篇老外的Blog 一般在console访问数据库的办法无外乎开一个rails console,指定环境,然后用ActiveRecord的方式访问数据库,例如: ./script/console production 或者用数据库客户端工具打开数据库,用SQL直接访问,例如: mysql -u "username" -p "dbname" 在生产环境下,数据库密码会设置的比较复杂,配置在config/database.yml里面,我如果碰到要直接访问数据库时,一般会通过ssh登录到服务器,然后从yaml文件中读出密码,然后通过客户端软件访问数据库,所以每次我都必须这 ...
缘起:这篇老外的Blog 说是在结对编程时,一件比较有趣的事情是快速写一些“聪明”的代码来折腾你的同伴 比如为了得到一个constant,这个constant保存周一到周日的名称 这位老大这样写: DAYS_OF_THE_WEEK = (0..6).inject([]) { |a,i| [(Time.now + (i * 86400)).strftime("%A").downcase, *a] } 这个时候你该如何向你的同伴解释这段代码的含义? 或者可以写成等价形式: DAYS_OF_THE_WEEK = %w[monday tuesday wednesday thursd ...
2007-12-11

Ruby中的结构体(struct)

关键字: struct
缘起:一直不理解ruby这门动态语言提供的struct用在什么地方,怎么用好? 拿静态语言C来说,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。定义一个“结构体”就像当于定义了一种自定义数据类型,包含了其他基本类型或以存在的其他类型数据。 struct stu { int num; ...
2007-11-27

用benchmark测试Symbol#to_proc的性能

关键字: benchmark,to_proc
缘起:老外写的一篇Blog 顺便学习benchmark的用法 众所周知rails对Symbol进行了扩展,添加了to_proc方法,详见dreamhead老大的一篇博文。 这个惯用法在《敏捷rails开发》第二版的15.6 An Extension to Ruby Symbols中也一笔带过。 用benchmark对比普通的Standard block跟Symbol#to_proc的性能差别: ruby 代码   require 'benchmark'   require 'rubygems'&n ...
2007-11-24

著名的变量命名规则,记录备查

关键字: 变量,命名规则
Camel标记法 -- 首字母是小写的,接下来的单词都已大写字母开头。 Pascal标记法 -- 首字母是大写的,接下来的单词都已大写字母开头。 匈牙利类型标记法 -- 在以Pascal标记法命名的变量前附加一个小写字母开头(或小写字母序列),说明该变量的类型,例如,i表示整数,s表示字符串。
2007-11-06

用ruby压缩,解压缩zip文件

关键字: zip, unzip
项目中有一个小需求: 一个csv文件定期在服务器端更新,并用打包压缩成zip格式文件存储到一个固定位置,文件名固定 而我的任务是写一个脚本,定期取得这个文件,解压缩,并用得到的csv生成一个sqlite3数据库 需求很简单,在javaeye上搜到一个帖子关于如何压缩zip文件,以及递归目录下所有子目录的办法 帖子里面gigix回复用很简单的方法,启动一个外部进程,我一开始也才用这个办法: ruby 代码   system("unzip -q -o #{ARGV[0]} somefile.csv&quo ...
2007-10-25

用mocha测试rails,mock HTTPResponse

关键字: ruby rails mocha
上周六去了shanghai on rails聚会,其中一节是张元一介绍关于mocha在rails测试中的应用 今天刚好项目测试代码中用到需要mock http response,刚好用到,要感谢张元一兄台 以前也写过信用卡支付网关以及soap服务器通讯相关的测试,用的办法是override掉http的request和response 比如下面这个典型场景,一个信用卡网关,我需要发送一个request请求,包含了请求的xml,网关处理信息后返回结果xml 需要测试的类Demo,包含一个实例方法request_to_services,request到服务器,服务器后执行返回 ...
rails程序中的邮件服务,一般都是用rails的ActionMail来提供的。 如何在开发中测试邮件服务? 可以用一个真正存在的邮件服务器来测试,比如在自己的电脑上安装一个邮件发送服务器(我一般用postfix),发送真实的邮件,缺点是需要额外的系统/网络依赖,或者用外部邮件服务器(比如Gmail的smtp服务),同样存在环境依赖,具体详细过程我曾经发过一篇Blog。 也可以在测试环境中将ActionMailer的deliver_method设置为:test,这样在测试环境中所有发送的邮件都不会送到邮件发送服务器的任务队列,而是保存在ActionMailer::Base.deliver ...
相对路径转绝对路径: # Converts a pathname to an absolute pathname. File.expand_path(RAILS_ROOT) 在脚本中取得当前绝对路径: 第一个办法: File.expand_path(File.dirname(__FILE__)) 第二个办法: Dir.pwd
Java程序员需要理解什么是CLASS_PATH,CLASS_LOADER这些概念,Ruby程序员也一样。 每次打开一个rib或者rails console,引用一个外部plugin或者库的时候,输入代码 ruby 代码 require ’class_name'   然后引用的外部文件就可以为我所用,这背后到底发生了什么? ruby解释器开始并不知道到哪里去找外部引用的文件,所以每次作require的时候,ruby解释器会自动把引用的文件添加到一个全局变量中,可以通过全局变量$"来查看当前ruby cla ...
2007-09-02

带颜色的puts输出

关键字: puts,color
可能是写java的时候形成的习惯,喜欢用System.out.println("Message");的方法来调试程序。 在写ruby or rails的时候,也经常在代码中随手将对象的值puts出来的方式调试程序。 有的时候输出信息太多,怎么才能快速找到自己puts到console的信息呢? 我的办法是给puts的信息添加颜色。 比如写一个helper方法,将信息跟颜色作为参数传入: ruby 代码   def my_puts(message, color = nil)   ...
2007-08-27

重新认识ruby的多态和duck type

关键字: ruby,多态,duck type
今天在考虑一个用state模式java实现的case应该如何用ruby来实现时,google到IBM开发网站上一篇非常棒的文章 http://www.ibm.com/developerworks/cn/java/j-ruby/ 让我重新思考ruby中的多态是什么? 多态在java中是如何定义的? 我这样理解: 多态需要借助接口来实现,就是所有实现了该特定的接口的类用起来都象他。 什么是duck type? 在Programming Ruby中这样定义:如果对象能够象鸭子那样行走,象鸭子那样呱呱叫,那么解释器会很高兴的把它当做鸭子来对待的。(Programming Ruby ...
2007-08-23

用Migration+Fixtures在数据库之间迁移数据

关键字: ruby,rails,migration,fixture
如何用migration的办法将数据在不同的rails环境数据库之间迁移? 可以用rails的migration方式,也可以用数据库自带的备份还原方式 数据库备份还原方式: mysqldump -u user -p password dev_database > dev.sql mysql -u user -p password produ_database < dev.sql rails的migration方法: 将当前环境数据库所有数据dump出来,保存到test/fixtures/×yml 切换当前rails环境 在当前环境下将yaml文件加载 ...
得益于Rubyforge.org汇聚了这么多优秀的rails开源项目,在开发中有丰富的选择,而不比重新发明轮子. 有些插件是用纯ruby写的,可以下载解压缩到vender/plugins目录下,ruby的类加载器找到并直接使用 而有些插件的底层是用C写的,需要在部署平台上进行编译,如我常用到的解析xml的插件"Hpricot",安装过程中需要进行本地编译 而本地开发后部署到生产环境,忘记了安装必须的插件的事情也时有发生 另外一种情况是版本问题,以Hpricot举例,从Hpricot0.5升级到0.6,对xml节点元素查找开始区分大小写,记得当时为了版本不兼容问题着实 ...
2007-05-04

Ubuntu下用Rails的ActionMail发送Email

关键字: Rails ActionMail Email
好久好久没有写过Blog了,五一放假其间赶紧补上。 在Ubuntu7.04上,可以用postfix作为邮件发送服务器,如果只想通过本机发送邮件,则可以考虑不使用smtp验证 安装postfix: ruby 代码 sudo apt-get install postfix   配置postfix: ruby 代码 sudo dpkg-reconfigure postfix  ruby 代码 internet Sit ...
lgn21st
搜索本博客
存档
最新评论