分类 Rails 下的文章

如何利用 Serverless 的特性又不至于放飞自我

缘由

简单心理的主系统基于 Ruby on Rails 已运行了 4 年多,随着业务发展,单体应用的局限性越来越明显,即使通过容器化大幅提升了其负载能力,简化了部署过程,但对于开发人员来说,随着时间的推移,系统内的耦合不可避免的越来越严重,开发体验越来越差。

在这个背景下,我们先尝试了微服务架构,微服务的高内聚特性,虽然可以较好的解决当前业务复杂度下系统耦合严重的问题,但若随着时间推移,部分复杂的微服务依然可能会发展成一个内部耦合严重的单体应用。

于是我们又把目光继续往前,开始尝试 Serverless。

Serverless 简单来说是一个事件驱动的全托管计算服务,你只需写好业务代码,剩下的事情托管给服务商即可。

听上去很简单,实际上手操作也的确非常容易。但问题就在于它过于简单,以至于对于复杂的业务需求,没有任何范式可参考。

单体应用有很多成熟的框架可以使用,并且这些框架大部分在微服务中也可以使用。但到了 Serverless,会突然陷入无框架可用的境地。虽然你可以把一个 MVC 框架上传上去当成一个可以处理多种请求的“超级函数”,但这会导致开发和维护的困难。

Read more...


最近碰到一个奇怪的问题

在运行完rails生成器生成模型/控制器等文件后,再进入沙盒环境的rails conosle就会报ruby解释器错误:

rails g model User name:stringrails console --sandbox#抛出错误#上方行数太多了,terminal无法显示完全.... 1558 /Users/x/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0.1/lib/rails/commands/console_helper.rb 1559 /Users/x/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0.1/lib/rails/commands/console.rb 1560 /Users/x/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0.1/lib/rails/console/app.rb 1561 /Users/x/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0.1/lib/rails/console/helpers.rb[NOTE]You may have encountered a bug in the Ruby interpreter or extension libraries.Bug reports are welcome.For details: http://www.ruby-lang.org/bugreport.html

如果运行完数据库迁移,在rails console里创建一个模型实例也是抛出一样的错误。

Read more...


March 12, 2016 8:46 PM

缘起

从零基础开始学习 Ruby / Rails 开始,选了 Vim 作为编辑器,之间的学习曲线非常之陡峭。由于是一直在业余时间学习,差不多花了两年时间,才慢慢习惯了在 Terminal 中使用 Vim, 但一直没有达到熟练使用的程度。慢慢的,我发现有下面几个痛点,我决定转向 Sublime Text.

代码过长后,预览无法预览所有的代码,ST 的预览小窗口可以给你实时的鼓励: 哇! 我写了这么多行代码了,感觉很爽!
在 Terminal 中打开 vim 后, 复制/粘贴代码,总是有格式问题,很烦人。
MacVim 是一个很好 GUI 客户端,但是在我的电脑上每次换行就自动切换为中文输入,非常烦人,可能上哪里配置有问题,但是我不想再花精力去解决了。
Vim 很强大,但是它是一把没有抛光的上古宝剑,需要耐心的打磨和练习,才能最大发挥它的功能。

安装

直接在官网下载安装即可,如果准备长期使用,请购买 License, 支持正版。

配置

强大的 Package Control
Package Control 是一个包管理工具,类似于 Homebrew, NPM, 用它来管理所有 ST 插件非常方便

基本的配置

打开 Preferences -> Settings-User,就可以为 Sublime Text 做一些基本的定制了

{
    "auto_complete_commit_on_tab": true,
     // 通过 tab 完成自动补全
    "color_scheme": "Packages/RailsCasts Colour Scheme/RailsCastsColorScheme.tmTheme", 
    // 通过 Package Control 安装的 RailsCasts Theme
    "font_face": "Monaco",
    // 指定字体
    "font_size": 12,
    // 指定字体大小
    "ignored_packages":
    [
        "Vintage"
    ],  
    // 如果安装了 Vintageous, 必须禁用 Vintage 
    "spell_check": true,
    // 拼写检查
    "tab_size": 2, 
    // Ruby 的风格,缩进为 2 
    "translate_tabs_to_space": false, 
    // 使用 space 来表示缩进                           
}
关于使用 Tab 和 Space 来表示缩进的区别,可以参考这篇文章:[Changing Between Spaces and Tabs in Sublime Text](https://css-tricks.com/changing-spaces-tabs-sublime-text/)

## 必备插件

 [AdvanceNewFile](https://github.com/skuroda/Sublime-AdvancedNewFile),此插件非常方便的新建文件和文件夹, 在 Mac 系统中,新建文件的快捷方式为: `command+alt+n`, 新建文件夹的快捷方式为:`shift+command+alt_n`

[Color Picker](https://github.com/weslly/ColorPicker) 在 Sublime Text 中直接调用 Mac 的颜色选择器,这也是我对 Sublime Text 中毒的原因之一。快捷键为:`command + shift + c`

[Color Highlighter](https://github.com/Monnoroch/ColorHighlighter) 可以将 View 中的表示颜色的16进制的值显示出对应的颜色

[Rails Snippet](https://github.com/tadast/sublime-rails-snippets)  这个需要添加四有仓库

[Ruby Test](https://github.com/maltize/sublime-text-2-ruby-tests) ,`contrl+.` : Switching between code and test (create a file if not found)

## Sublime Text 常用快捷键

- `Command + T ` 非常强大的文件查找命令:

- `csc`: 支持模糊匹配,`cotroller\sessions_controller.rb` 可以这样简写
- `csc:10`: 在搜索项后面加上冒号,可以指定光标定位到被查找文件的指定行处
- `csc@ini` : 在搜索项后面用 @ 符号,直接定位到文件中的 method, 搜索 method 时也是支持模糊匹配的
- `Command + D` 选中一段文本后,按下 `Commad + D` 后,会自动选中下文中同样内容的文本,然后就可以一起编辑了。
- `Control + Shift + Up/Down` 在多行中选中同一列,然后一起编辑
- `Command + / (Slan)` 注释一行或取消一行注释
- `Command + Shift + D` 复制当前行或者当前被中的内容

多窗口调整布局的快捷键

- `Option + Command + 2` : 2 列窗口布局
- `Shift + Option + Command + 2`: 2 行窗口布局
- `Option + Command + 1`: 回到一个窗口布局
- 
## 参考资料
[http://www.sublimetext.com/docs/3/index.html](http://www.sublimetext.com/docs/3/index.html)
[http://docs.sublimetext.info/en/latest/index.html](http://docs.sublimetext.info/en/latest/index.html])
[]http://thunderboltlabs.com/blog/2013/11/19/efficiency-with-sublime-tex](http://thunderboltlabs.com/blog/2013/11/19/efficiency-with-sublime-text-and-ruby/)

测试的哲学

  • 测试应该是可靠的
  • 测试应该容易书写
  • 测试应该容易理解

一些妥协

  • 速度不是测试中关注的重点
  • 过于DRY的代码不是测试中关注的重点

参考原文

Model Specs

  1. 为当前的Model创建一个spec
  2. 可以使用factories来简化测试数据的维护和创建
  3. 为Model的validation,class,以及instance method写能够通过的测试用例

get started

A model spec should include tests for the following

factory默认生成的对象必须合法

describe Contact 
  it "has a valid factory" 
  it "is invalid without a firstname" 
  it "is invalid without a lastname" 
  it "returns a contact's full name as a string"
  • 每一个测试用例只测试一件事情
  • 每一个测试用例都必须明确
  • 每一个用例的描述都以动词开头而不是should

Read more...


ruby对象模型

实际上ActiveSupport::Concern是对mixin的一些通用的模式进行的一个封装。而mixin就像是一个“虚拟的类”,用来注入到class或者module的祖先链中去。

module MyMod
end

class Base
end

class Child < Base
  include MyMod
end

# irb> Child.ancestors
#  => [Child, MyMod, Base, Object, Kernel, BasicObject]

上面的情况与下面这段代码有着相同的祖先链结构

class Base
end

class MyMod < Base
end

class Child < MyMod
end

# irb> Child.ancestors
#  => [Child, MyMod, Base, Object, Kernel, BasicObject]

模型也可以用来作为扩展一个对象

my_obj = Object.new
my_obj.extend MyMod

# irb> my_obj.singleton_class.ancestors
#  => [MyMod, Object, Kernel, BasicObject]

在Ruby中,每个对象都有一个eigenclass,Object#extend的行为与Module#include的行为是相同的,只是前者是作用在对象的eigenclass上面。所以下面的代码和上面的代码效果一致。

Read more...