Monthly Archives: 三月 2013

Rails 中使用 mysql 的 tinyint 字段类型

Rails 中使用 mysql 的 tinyint 字段类型需要注意一些事情,有陷阱,请小心。 默认 Rails 把 tinyint(1) 作为 boolean 类型的映射,所以我们不能使用 tinyint(1) 在 Migration 的create_table 中,我们不能使用 t.tinyint 定义 tinyint 字段,只能使用 t.column :name :tinyint

Posted in ruby on rails | Tagged | Leave a comment

Rails Production环境中关闭/禁用日志

在文件 config/environments/production.rb 中添加: config.logger = Logger.new(‘/dev/null’) 测试过给 config.logger 设置为 nil 无用

Posted in ruby on rails | Tagged | Leave a comment

Ruby 2.0 double splat (**) 双星号的一些用法

double splat 除了可以在方法定义中简化 opts 外, 还可以用来组装 hash, 以后可以少写几个 merge 了: h1 = {a: 1} h2 = {b: 2} h3 = {**h1, c: 3, **h2} #=> {:a=>1, :c=>3, :b=>2} 后放入的项会覆盖前面的项 h3 = {**h3, a: ‘rewritten’} #=> {:a=>’rewritten’, :c=>3, :b=>2} 任何实现了 to_ary … Continue reading

Posted in ruby on rails | Leave a comment

Unicorn 无缝重启

无缝重启: 重启过程中不能中断服务,因为网站都是需要7×24提供服务的,不能每次更新代码网站都有一断时间 无法访问,虽然中间可能只有不到1分钟的时间。 不管任何服务进程要实现无缝重启,大概都得按照先开新的进程接,然后优雅的结束老的进程, 优雅的结束老的进程意思是老的进程要处理完当前的请求之后才能结束。 Unicorn 无缝重启简单 5 步搞定:(官方的文档) 给 Unicorn 主进程发送 USR2 信号 kill -USR2 pid 确定当前新的主进程已经完成启动,如果使用 pid 文件,那么会生成一个 .oldbin 的文件存放老的主进程 pid。 现在呢,会有 2 个主进程和双份的 worker 进程,类似下面的进程树: unicorn master (old) \_ unicorn worker[0] \_ unicorn worker[1] \_ unicorn worker[2] … Continue reading

Posted in ruby on rails | Tagged | Leave a comment

unicorn 部署 Ruby on Rails 开机自启动

最近把 s.yanghao.org 从 php + python 转型到 Rails 框架, 第一次使用 Rails 遇到的麻烦真不少,最麻烦的还真得算部署, 如果不计较安全问题,统统使用 root 帐号操作,这些问题就不是什么问题, 为了安全,我们做以下限定: 不能使用 root 帐号运行 unicorn 进程 运行 unicorn 的帐号不能有 sudo 权限 为了使服务器能运行不同 ruby 版本,应使用 rvm 用户模式安装 ruby 这些为我们带来的问题: 开机需要自动运行 unicorn 重新部署之后需要重启 unicorn 开机自动运行 unicorn 可以使用 … Continue reading

Posted in ruby on rails | Tagged | Leave a comment

ubuntu 12.04安装ruby mysql2 gem的问题

gem install mysql2 出现下面错误: Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. checking for rb_thread_blocking_region()… yes checking for rb_wait_for_single_fd()… yes checking for mysql_query() in -lmysqlclient… no checking for main() in -lm… yes checking for mysql_query() in -lmysqlclient… no checking for … Continue reading

Posted in Linux, ruby on rails | Tagged | Leave a comment

rspec 中 let 和 subject 的区别

let 和 subject 很像,同出一源,都是通过委托来定义一个消息的接收方,这句话的意思可以理解成:为某个方法调用(此调用的结果是一个对象,这一点毋庸置疑,因为一切都是对象)绑定一个“名字”(一般用 symbol),于是在后面的测试样例中,我们可以用这个名字来指代它。最直接的好处就是可以让代码更精炼,提高可读性,减少重复。 说它们同出一源,可以通过源码获知: def let(name, &block) ::RSpec::Core::MemoizedHelpers.module_for(self).define_method(name, &block) define_method(name) do __memoized.fetch(name) { |k| __memoized[k] = super() } end end 简单地说,我们传递了 name 和 &block 给 let,于是返回给我们一个 defined method;再看 subject: def subject(name=nil, &block) let(:subject, &block) alias_method name, :subject if … Continue reading

Posted in ruby on rails | Tagged , , | Leave a comment

Ruby随机生成字母

(‘a’..’z').to_a.shuffle[0..7].join

Posted in ruby on rails | Tagged | Leave a comment

使用 Ruby 编写 Web 定向爬虫

Spider Anemone Anemone官方介绍 Anemone是一个Ruby库,使用他可以快速、无痛的编写抓取一个网站的爬虫。 他提供简单的DSL执行每一个页面的方法,跳过某些URLs,计算每一个页面的最短路径。 多线程使用Anemone更快速,简单的API,和Ruby语言的表现力使用它更强大。 Mechanize

Posted in ruby on rails | Tagged , , | Leave a comment

重构臃肿 ActiveRecord 模型的 7 种方式

当团队使用 Code Climate 来提高 Rails 程序的代码质量时,他们就会学习到如何防止模型慢慢变得臃肿。“胖模型( Fat models )” 在大应用中会导致维护问题。它仅仅比那种充斥着各种业务逻辑的凌乱的控制器好一点,但它们都违反了单一权责原则(SRP)。“任何有关用户做什么” 这种并不是单一权责。 刚开始, 单一权责很容易做到。 ActiveRecord 类只处理持久化,关联关系,并不管其它东西。但是,一点点地,他开始增长。原本应该只负责持久化的对象实际上也包含了其它的业务逻辑。所以,一两年后,你的 User 类超过了 500 行,有上百个公共方法。邪恶的回调问题开始出现。 随着你的程序越来越复杂(功能越来越多), 你的目标是在一些协调的,细小的封装对象(从更高层次来说就是模块)中传递信息,就像是在平底锅底抹面粉块一样。胖模型就像是你放入锅里面的一大块面团。你要将它重构成小块,均匀地分摊业务逻辑。不断地重复这个过程,最终你会得到一系列和谐工作在一起的简单对象。 你可能觉得: Rails 让正确实践面向对象编程(OOP)变困难了 我过去也是这样认为的。但是做了一些探索和实践之后,我发现 Rails (这个框架)完全没有阻止我们实践面向对象编程。其实是 Rails 的约定(convention)没有刻意强调这个,或者说是,它除了 ActiveRecord 模型能处理的情况外,缺乏管理更复杂的情况的约定。幸运的是,我们能够找到 Rails 缺少的, 如何应用基于面向对象原则的最佳实践。 不要从胖模型中抽离混入(Mixins) 为什么呢?我避免将一个大的 ActiveRecord 类里面的一部分方法放到某个关联类或者模块里面,然后将它们混入。我有一次听到这样的说法: Any application … Continue reading

Posted in ruby on rails | Tagged | Leave a comment