Don't Panic

A One and a Two

如何重构 Rails 项目

| Comments

Am I doing it wrong?

前天在 GitHub Gist 上看到一个有趣的讨论

事情的起源是 @justinko 因为自己写的一段代码而失去了一份工作合约。那么究竟是什么样的代码「惹火」了雇主呢?

在那样项目中,当用户发表评论后,后台需要做的不仅仅是在数据库中插入一条评论记录,还需要识别出评论的语言、检查是否是垃圾评论、发送邮件以及同步到 Twitter 和 Facebook。@justinko 觉得这些代码既不应该属于 controller 也不应该属于 User model, 也不应该用 ActiveRecordcallbacks 来实现。

于是他新建了一个 PORO (Plain Old Ruby Object) 来处理这些逻辑。代码如下:

post_comment.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# app/use_cases/post_comment.rb
# Called from the "create" action in a controller

class PostComment
  def initialize(user, entry, attributes)
    @user = user
    @entry = entry
    @attributes = attributes
  end

  def post
    @comment = @user.comments.new
    @comment.assign_attributes(@attributes)
    @comment.entry = @entry
    @comment.save!

    LanguageDetector.new(@comment).set_language
    SpamChecker.new(@comment).check_spam
    CommentMailer.new(@comment).send_mail

    post_to_twitter  if @comment.share_on_twitter?
    post_to_facebook if @comment.share_on_facebook?

    @comment
  end

  private

  def post_to_twitter
    PostToTwitter.new(@user, @comment).post
  end

  def post_to_facebook
    PostToFacebook.new(@user, @comment).action(:comment)
  end
end

Use Pry Instead of IRB

| Comments

IRB 作为原生的 Ruby 交互式解释器,给每个 Rubyist 调试程序时都提供了极大的便利,包括 Rails console 都是构建在 IRB 之上。

但是有一款工具功能更加强大使用更加方便,那就是目前 Ruby 社区中很火的 Pry。现在是时候放弃使用 IRB 了。

Installation

Pry 的安装非常简单,因为它本身就是一个 gem. gem install pry (如果使用 rbenv 管理 Ruby 环境的话,别忘记 rbenv rehash)

然后运行 pry, 就可以像 irb 一样执行 Ruby 代码了。

Usage

0. Code Highlight & Indent

使用 irb 时很头疼的一点就是定义一个类/方法时,代码没有缩进,很容易写了好几行代码然后发现写错了不得不重头再写起。

使用 Pry 则完全不用担心这种问题,换行时会自动缩进,而且支持代码高亮。如下图:

换个城市生活

| Comments

8月份看到 @dhh 的几条关于纸质书籍的 tweet 让我很为赞同,而后又发了两条给我的印象更加深刻。今天特意翻了出来分享一下。

Nothing liberates you from “stuff” like learning to travel light. I never check luggage, everything fits in a carry-on. 2 days or 3 weeks.

Best thing is that you learn never to miss your crap. Which makes it that much easier to throw out/donate later. Moving is similar.

@dhh

上次旅行大概是10年10月份的时候,记得很清楚。国庆后回哈尔滨考了两门选修课,然后面了百度的二面和终面拿了Offer,火速回京签约然后当天辞掉了腾讯的实习,订了张去南京的机票,第二天就飞走和温偏两位大师重游南京了。那时候好像才跟当时的女朋友交往不到两周,但是为了旅行/兄弟…… 好吧,其实我就是想散散心,刚工作那会儿觉得太不自由了,有些不习惯。

我记得去年偏大师从遥远的重庆邮过来两本杂志,还附赠一张煽情的小纸条,「心灵和身体永远有一个要在旅行」之类的。这转眼一年多过去了,这两种旅行似乎都没有着落。

我挺能折腾的,但生活倒也不算太乱。离开团队这半年,总在回想我们究竟做错了什么,我做错了什么。也在思考到底什么样的生活状态适合自己。关于这样的问题,只有内心坚定的人才会有明确的答案吧,我应该暂时还不属于那种人。但是我属于那种想到了一种生活方式就想去尝试一下,过得没想象中的好?那也没关系,调整调整再换种方式,尝试下一种。

所以,我在想下一种是什么。没准该从换个城市开始。

Dotfiles::Vim 0.

| Comments

关于如何让生活变美好,每个人都有自己的努力方式。而我的努力方式之一就是不断完善自己开发过程中使用的工具,关注我 GitHub 的同学能发现我几乎每天都会更新我的 dotfiles. 最近觉得自己的配置已经接近我理想中的完美状态,所以决定写些文章记录一下,但愿会帮到一些初学者,或者能够收获更多的建议帮助我的 dotfiles 变得更加顺手与高效率,让我的生活更加美好一些。:-)

Brief

  • 安装有 Ruby 支持的 Vim

  • 配色方案及基本配置

  • Command-T.vim 插件:文件间快速切换的插件

0. 安装有 Ruby 支持的 Vim

首先,为什么要安装有 Ruby 支持的 Vim 呢?因为本文要介绍的 Command-T 插件依赖于 Ruby。如果你看到这里觉得还要再去重新安装一遍 Vim 觉得很麻烦的话,不妨先跳到后面介绍 Command-T 的部分。然后你就会发现花一点时间来做这件事是很值得的了。

Rails源码阅读 0: ActiveSupport::Concern

| Comments

ActiveSupport::Concern 模块除去注释外只有29行代码,但是却有着不可忽视的作用。它使得 modules 之间的依赖关系处理起来更加得优雅。

假设我们有两个模块 Foo 和 Bar,Bar 模块依赖于 Foo 模块。然后 Host 类希望包含 Bar 模块获取其中的实例方法。

module_dependency_sample.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module Foo
  def self.included(base)
    base.class_eval do
      def self.method_injected_by_foo  # 在 base 模块中定义一个类方法
        ...
      end
    end
  end
end

module Bar
  def self.included(base)
    base.method_injected_by_foo  # 调用 base 模块的类方法,该方法是在包含 Foo 模块时动态定义的
  end
end

class Host
  include Foo  # 我们需要包含 Foo 模块,因为 Bar 模块依赖于 Foo 模块
  include Bar  # 但是 Bar 模块才是 Host 类真正需要的模块
end

也许你会想:既然是 Bar 模块依赖于 Foo 模块,为什么不直接在 Bar 模块中包含一下 Foo 模块呢?就像下面这样:

重看一一

| Comments

前几天推荐朋友看一一,自己也翻了翻旧文,才记起是两年前看得这部电影,但却一直觉得它陪了我好久。大概只是印象太深刻的缘故吧。

我们究竟错过了什么?

NJ去东京出差,和初恋女友一起。镜头不断的变化着场景,但都只是他们两个人絮絮叨叨的说着旧事。他们说起第一次牵手的场景,镜头闪回到台北,就像30年前一样,火车经过,婷婷的男友也牵起了她的手。而NJ和阿瑞,时隔那么多年,再一次牵起了手,时间不同,地点不同,没变的是NJ的手还是紧张得出了好多汗;她怪他,怪他当年等他一直都等不到,怪他不理她,怪他让她的生活没有了希望;他也怪她,她让他考电机系,他考上了,父母家人还有她都很开心,但NJ自己却高兴不起来,她并不在意他原本想要什么的生活,然后他便选择了离开。

NJ说人是不能让另外一个人去老教你怎么活下去,怎么过日子,那样是很悲哀的,但偏偏这个人确是他最爱最爱的人。最后一晚,阿瑞关上门后,NJ又敲开门说:我从来没有爱过第二个人。

四季轮替

| Comments

前几天看了最近挺火的英剧Black Mirror,难以避免得再次装逼似的陷入了”深深的思考”。虽然有些所想与这部剧没无太大关系,但也都一并记下吧。

0). 你原本只是怀揣着单纯美好的梦想,或者只是平淡生活的小小目标。你住在狭小的屋子里,每天机械的重复着无聊的事情。直到遇见自己喜欢的姑娘,陪她聊天听她唱歌就很开心了,甚至耗尽自己的所有送她上了最大的舞台,在背后鼓励她支持她。可她最后抵挡不住诱惑屈从了内心深处的欲望,背叛了自己,也背叛了你。你愤怒至极,你甚至想过自暴自弃。后来你通过逆天的努力登上了同样了舞台,你把满腔的愤怒全部发泄了出来,你向权威宣战你与整个世界为敌。可是结果呢,多让人意想不到啊,摆在她面前的诱惑同样摆在了你面前。那是曾经让你多么不屑、恼怒与鄙视的诱惑啊,可你并没有像当初你本希望她那样的果断拒绝,同样的选择了接受。讽刺的是,结局只是你从狭小的房间搬到了大一点的房间,而已。

往事已矣不可追

| Comments

往事已矣不可追,人生大喜复大悲。天下英雄出我辈,一入江湖成碎摧。君不见,威廉红帐烛未冷,拉登蜗居身成灰;君不见,四丝犹在未见五,乔布斯人已不归;君不见,曾经金正难为日,除去卡扎不是菲。凭尔豪气宴四海,终是曲终人散把灯吹。此些事,一壶浊酒道不尽,日后上船再续杯。— @马伯庸

这一年问自己最多的就是我究竟想要一种什么样的生活。思考的结果往往让我陷入一种意淫后无限向往而达到目标却遥遥无期的尴尬。我并不希望一切都啜手可得般简单,但一年来我越来越坚信这梦想般的生活离我太过遥远,而且按我这一年的工作与生活来看,确切得说,有些渐行渐远。所以我还是选择迈出了第一步,至于结果究竟是什么我并不敢过多得遐想与奢望,但我确信这是一条漫长但适合我的路。

最近

| Comments

0) 日子过得好快,算起来上次正经写篇博客应该是五个多月前的事情了,记录了自己3年大学生活的站点也已经被我关掉,指向了这里。 这五个多月来发生了不少事情。7月份我终于毕业了,彻底告别了自己的学生时代,虽说对大学的情感错综复杂,但丝毫不影响我临别时的一点点忧伤。有时候都会想,十年内还会不会回去看看。然后我就正式入职了,终于不再是每个月可怜的实习生工资,工作上似乎没有太大改变,依旧是没太大兴趣。后来加入了现在这个小团队,做些有意思的事情。

1) 这段时间来,自我感觉技术水平有了不少提高。我是个比较没趣的人,不太会找些事情娱乐自己(倒是偶尔会从头到尾追一部剧集),所以大多数时间都是看看书写点有意思的代码。而最近越来越忙,书桌上堆积的未读书籍也越来越多,所以总有种不在进步的忧虑。以后即使再忙也该多读些书不断的给自己补充能量。