加载中...

锦囊妙计


When you choose a language, you’re choosing more than a set of technical trade-offs—you’re choosing a community. - Joshua Bloch

这一章介绍一些常见的Rails疑难杂症问题,以及常用的RubyGem套件。更多热门套件可以参考The Ruby Toolbox和awesome-ruby。

Bootstrap

Bootstrap是目前最流行的前端设计框架,让开发者也可以很轻松的进行网页排版,也很有多现成的Theme可以套用。要在Rails使用Bootstrap,请安装bootstrap-sass

如果搭配分页套件kaminari的话,执行rails generate kaminari:views bootstrap3就会产生对应的kaminari样板。

进一步可以参考Integrating Rails and Bootstrap这一系列文章。

Rake

Rake 用来编写任务脚本,让我们在CLI中可以执行。它的好处在于提供良好的任务编写结构,并且很方便设定各个任务的相依性,例如执行任务C前,需要先执行任务A、B。在 Rails 之中就内建了许多 rake 指令,除了你已经使用过的 rake db:migrate 之外,你可以输入 rake -T 看到所有的 rake 指令。

而要在 Rails 环境中撰写 Rake,请将附档名为 .rake 的档案放在 lib/tasks 目录下即可,例如:

# /lib/tasks/dev.rake
namespace :dev do

  desc "Rebuild system"
  task :rebuild => ["db:drop", "db:setup", :fake]

  task :fake => :environment do
      puts "Create fake data for development"
      u = User.new( :login => "root", :password => "password", :email => "root@example.com", :name => "管理員")
      u.save!
  end
end

透过执行 rake dev:rebuild,就会砍掉重建数据库,最后执行 rake dev:setup 建立一些假资料作为开发之用。

其他常见的使用情境包括:1. 修正上线的资料,这样部署到Production后,可以用来执行 2. 建立开发用的假资料 3. 搭配排成工具使用,例如每天凌晨三点寄出通知信、每周一产生报表等等

更多介绍可以参考 http://jasonseifer.com/2010/04/06/rake-tutorial 这篇文章。

分页

  • will_paginate
  • kaminari

档案上传

  • Paperclip 是目前使用上最为方便的档案上传 plugin。
  • CarrierWave

ActiveReord增强

加强搜寻

  • Ransack可以很快的针对ActiveRecord做出排序和复杂的条件搜寻。

列表结构(自订排列顺序),搭配 jQuery UI Sortable 就可以做出拖拉排序,可以参考Sortable Lists这篇文章。

  • ActsAsList
  • ranked-model

树状结构

  • ActsAsTree
  • ancestry
  • awesome_nested_set

Tagging 标签

  • acts-as-taggable-on 制作 Tag 功能。

Soft Deletion 和版本控制,编辑和删除后还可以留下纪录和还原,

  • paper_trail 另开一个 versions table 完整纪录
  • paranoia 加一个字段标记被删除

有限状态机,适合用来设计比较复杂的 model 流程状态

  • aasm

资料表注解,会帮你在model code上面注解加上所有资料表的字段

  • annotate_models

根据ActiveRecord的关联自动产生漂亮的Entity-Relationship Diagrams

  • rails-erd

处理 HTTP

请参考 HTTP client 这篇文章。推荐 httpclient 或 faraday。

PDF

  • Prawn 可以产生 PDF,支援 Unicode。
  • PDFKit 则是另一个有趣的产生方式,透过 HTML/CSS 转 PDF。
  • Prince 是一套商用方案,将 HTML/CSS 转 PDF

CSV

Ruby就有内建这个函式库了,只需要require "csv"即可使用。

YAML

Rails 的数据库设定档 database.yml 是用一种叫 : YAML Ain’t Markup Language 的格式所撰写,档案打开来,看起来就像一般的 plain 设定档,非常容易修改。

YAML 的设计首要目标就是要让使用者容易看懂,可以和 script 语言搭配良好。用途有 资料序列化 data serialization、设定档 configuration settings、log files、Internet messaging、filtering 等。网站上已知有支援的 script 语言有 Python,Ruby,Java,PHP,Perl,Javascript 等。

require ‘yaml’

ps2 = YAML.load_file(‘example.yaml’)
ps2.each do |it|
  puts it.inspect
end

JSON

Rails 内建就有 ActiveSupport JSON,用法如下:

ActiveSupport::JSON.encode( [ {:a => 1 , :b => 2 } , "c", "d" ] )
=> "[{\"a\":1,\"b\":2},\"c\",\"d\"]"    

ActiveSupport::JSON.decode( "[{\"a\":1,\"b\":2},\"c\",\"d\"]" )
=> [{"a"=>1, "b"=>2}, "c", "d"] 

yajl-ruby 则是一套底层用C,比较快很多的 JSON parser,建议可以让Rails底层改用这套函式库,请在Gemfile档案中加入

gem 'yajl-ruby', :require => 'yajl'

XML

Rails 内建使用 Ruby 的 XML 函式库 Builder

Nokogiri 是一套基于 libxml2 的函式库,效能较佳。可参考 Getting Started with Nokogiri一文介绍用法。

如果要替换 Rails 内建的 XML 函式库,请在Gemfile档案中加入

gem 'nokogiri'

有些函式库为了执行效率,底层会改用 C 的函式库,适合于正式上线环境,缺点是需要编译,在一些特殊环境可能无法运作,例如最新版的 Nokogiri 就不支援 Windows 了。而纯 Ruby 实作的版本就没有这个问题。

表单

除了用Rails内建的表单Helper,也有一些提供表单设计更方便的套件:

  • simple_form
  • formtastic

Admin 接口

  • ActiveAdmin
  • RailsAdmin

如何画图表

使用 GoogleCharts 是最简单的方式。 如果您使用 jQuery,flot 是一套不错的图表工具。

Recapache

  • Recaptcha 是做 captcha 最简单快速的方式。

排程工具

如果您有周期性的任务需要执行,除了可以透过Linux的crontab设定去执行rake脚本。例如输入crontab -e加入:

0 2 * * * cd /home/your_project/current/ && RAILS_ENV=production /usr/local/bin/rake cron:daily

就是每天凌晨两点执行rake cron:daily这个任务。

或是你可以安装whenever这个 gem,就可以用Ruby的语法来定义周期性的任务,可以很方便的设定服务器上的cron排程。

自动备份

  • https://github.com/meskyanichi/backup

可以搭配 whenever 就可以定期备份了

升级Rails

小版号的升级,通常透过以下步骤即可完成:

  • 修改Gemfile的Rails版本: gem 'rails', '3.1.1'
  • 执行bundle update
  • 执行rake rails:update 会尝试更新Rails自己产生的档案,例如config/boot.rb,请一一手动检查。

升级前,也请参阅官方公告的升级注意事项。

如何变更 ActiveRecord 默认的资料表和主键名称

如果要将Rails沿用上旧有的数据库上,就会发生的资料表名称和主键名称不是 Rails 默认惯例的情况,也就是表格名称不是Model名称的复数型,主键不叫id。这时候我们可以手动设定过,例如以下 Model 默认的资料表和主键是legacy_comments和id,但是我们想要改成comment和comment_id:

class LegacyComment < ActeveRecord::Base
    self.table_name = :comment
    self.primary_key = :comment_id
end

其他

  • http://asciicasts.com/episodes/255-undo-with-papertrail
  • http://intridea.com/2011/5/13/rails3-gems
  • http://erik.debill.org/2011/12/04/rake-for-rails-developers

还没有评论.