Ruby On Rails 常用的精品Gem汇总

先是必要注爱他美点,本文是原创的并不是从其余地点转载。所有的数量是自我从
GitHub 和 RubyGems 上码下来的,数据的截取时间就是本文的颁发日期。

RubyGems 的下载量可以见见在用那些 gem
的总人口,所以数值很大(那里收藏的下载量至少会胜出10万级)。而在 GitHub
上的则表示关怀那几个gem的源码的人口(本文收藏的起码是过 1k之上 Star 的
repository)

Nokogiri

gem 'nokogiri'

收集数据是大家要求分析复杂的 HTML 结构,从中得到必要的多寡,Nokogiri
可以帮助我们完善的处理差别网页上边不相同的 HTML
结构,并且有很好的编码处理能力,用它你绝不顾虑页面是 GB2312 仍然 GBK
照旧 UTF-8,它都很很好的处理,解析结构可以用接近 jQuery 的 CSS Selector
的不二法门查找,十分有利于。曾经用过 Ruby 的某些个近乎插件,最后发现 Nokogiri
才是最好的。

Faraday

gem 'faraday', '~> 0.9.1'

法拉第 是一个HTTP的客户端,可以提供一般化的接口和多样的适配器 (例如
Net::HTTP)。

做一些互连网服务API集成它是一个很好用的助理。

conn = Faraday.new(:url => 'http://sushi.com') do |faraday|
  faraday.request  :url_encoded             # form-encode POST params
  faraday.response :logger                  # log requests to STDOUT
  faraday.adapter  Faraday.default_adapter  # make requests with Net::HTTP
end

## GET ##
response = conn.get '/nigiri/sake.json'     # GET http://sushi.com/nigiri/sake.json
response.body

conn.get '/nigiri', { :name => 'Maguro' }   # GET http://sushi.com/nigiri?name=Maguro

conn.get do |req|                           # GET http://sushi.com/search?page=2&limit=100
  req.url '/search', :page => 2
  req.params['limit'] = 100
end

## POST ##
conn.post '/nigiri', { :name => 'Maguro' }  # POST "name=maguro" to http://sushi.com/nigiri

# post payload as JSON instead of "www-form-urlencoded" encoding:
conn.post do |req|
  req.url '/nigiri'
  req.headers['Content-Type'] = 'application/json'
  req.body = '{ "name": "Unagi" }'
end

## Per-request options ##

conn.get do |req|
  req.url '/search'
  req.options.timeout = 5           # open/read timeout in seconds
  req.options.open_timeout = 2      # connection open timeout in seconds
end

RSPEC-RAILS

gem 'rspec-rails', '~> 3.4'

若是没有用过 RSpec 都不能算是懂 Ruby 吧,respec_rails 顾名思义是将
rspec 集成至 rails 中的测试框架了:

require "spec_helper"

describe User do
  it "orders by last name" do
    lindeman = User.create!(first_name: "Andy", last_name: "Lindeman")
    chelimsky = User.create!(first_name: "David", last_name: "Chelimsky")

    expect(User.ordered_by_last_name).to eq([chelimsky, lindeman])
  end
end

Devise

gem 'devise', '~> 3.5', '>= 3.5.2'

Devise 是一个用以飞快打造基本用户效能,如:注册,登陆,找回密码。
同时它还合并了第三方的登入帮助,代码也十分简单:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :confirmable, :recoverable, stretches: 20
end

Devise 是一个大集成包,单看看它集成了怎么就能精通到大极品的机能了:

  • Database Authenticatable:
    扶助加密的身份验证并能将注解新闻存储于数据内。
  • Omniauthable: 集成 OmniAuth
    落成三方平台(如: 推特(Twitter), 非死不可, 新浪新浪, 腾讯
    QQ)账号登陆的支撑。
  • Confirmable: 发送邮件以注明注册用户的地位。
  • Recoverable: 协助密码重置。
  • Registerable:帮衬注册新用户。
  • Rememberable: 辅助活动登录
  • Trackable: 可跟踪用户的登入次数,时间戳和 IP
  • 提姆eoutable: 援救电动用户会话的晚点
  • Validatable: 可验证用户的邮件的与密码的不易,且可定制化。
  • Lockable: 可以锁定数十次品尝登录失败的用户账号。

比方没有它,光想想要大家团结一心来码上边的那么些效应都够浪费时间的。重点是各类序列都得用啊。

FACTORY_GIRL_RAILS

gem 'factory_girl_rails'

Factory
Girl可能是ROR测试中最常用到的数目工厂,没有它也只好手工写Fixture了。不解释了,它太常用了。

# spec/factories/user.rb
FactoryGirl.define do
  factory :user do
    first_name "Andy"
    last_name  "Lindeman"
  end
end

# spec/models/user_spec.rb
require "spec_helper"

describe User do
  it "orders by last name" do
    lindeman = create(:user)
    chelimsky = create(:user, first_name: "David", last_name: "Chelimsky")

    expect(User.ordered_by_last_name).to eq([chelimsky, lindeman])
  end
end

Better Errors

gem "better_errors"

它用一个更好的,更管用的失实页替换标准的 Rails 错误页面,对 Rack
middleware 也一律有效。

Bootstrap 1

4百多万的下载,可知赏心悦目是很能引发大家那个外观第一的程序员的。

twitter-bootstrap-rails

gem "therubyracer"
gem "less-rails" 
gem "twitter-bootstrap-rails"

来自 推特(Twitter) 的 Bootstrap,是一套达成的前台 CSS
框架。以简洁,优雅著称于世。被众多攻城狮所强调,又让许多程序猿审美疲劳。不用更加啊~

分页控件

will_paginate

gem 'will_paginate', '~> 3.0.6'

Kaminari

gem 'kaminari'

Kaminari 帮助多样的 ORM (ActiveRecord, Mongoid) 和多样的Web框架 (Rails,
Sinatra, Grape), 以及三种的模板引擎 (ERB, Haml, Slim).

从数字上两者都只在伯仲之间,只是will_paginate 相比老, 应用案例较多,
kaminari 更新, 品质和包容性更好。

安排职务

偶尔有些义务的履行会很慢,而这个职分大家并不要求须求立时重返结果
(比如:发送邮件,生成图片缩略图),那大家得以选择将那个职分放到后台执行,以便于页面不会长日子等待执行,大家依旧将其统称为安顿任务吗。

在那上头的有成百上千突出的 gem, 其粉丝也很多

Resque

gem 'resque', '~> 1.25', '>= 1.25.2'

Resque 是一个按照 Redis
的后台职分处理gem。后台工作可以是其他一个Ruby类或者模块。

Resque 比较于 DelayedJob 会是一个进一步重型的gem。与 DelayedJob
的分歧之处主要有三:

  • 它是一个用于创制、查询、处理 的 Ruby 库
  • 它是一个起步后台处理Worker的Rake义务。
  • 它是一个Sinatra app 用于检测队列、工作和Workers.

    class Archive
    @queue = :file_serve

    def self.perform(repo_id, branch = ‘master’)

    repo = Repository.find(repo_id)
    repo.create_archive(branch)
    

    end
    end

    class Repository
    def async_create_archive(branch)

    Resque.enqueue(Archive, self.id, branch)
    

    end
    end

Sidekiq

gem 'sidekiq'

名叫质量要比 Reque 和 delayed_job 都要高,具体的数目你可以上它们的
GitHub 上看,有一个总体的比较表。但强烈在程序员的受欢迎度上或者要差于
Resque。

Resque 和 Sidekiq 都采用的 redis
作为天职数据存储,那块是基本上的,紧要的界别依然在多任务处理的方式是不等同的。

resque 使用的是一个 worker 通过 fork 格局来暴发多个 worker
处理多个义务,而 sidekiq 是一个 worker 使用的 Thread 方式发出多少个线程
处理多少个职务。

那 fork 方式和 thread 形式有何样差别吗?

fork 方式

fork
一个历程,操作系统会确立一个独自分开的地方空间,并且从父进度复制所有的内存片段到那几个地方里面去。
那就意味着对于操作系统来说,对于 fork
的历程切换上下文,因为须求保留和加载所有数据,所以代价更大。
而且假使父进程死掉了,那么些 fork 的子进程没有退出的话,将会化为僵尸进度。

thread 方式

二十四线程的话是共享地址空间,内存并且多线程之间的互相也正如方便。而且你也不用担心僵尸进度的题材,一旦经过死掉,
所有的线程会活动被杀掉。但那种方法也有瑕疵,你必须有限协理代码是线程安全的,不然可能会唤起麻烦。

简单得出

  • resque 比 sidekiq 更花费内存
  • resque 的 worker 代码没有要求担心线程安全难题,但 sidekiq 必须考虑

DELAYED_JOB

gem 'delayed_job_active_record'

DelayedJob 是一个轻量型的gem,使用起来也万分的简要,而且它可以合作一个
progress
bars

控件检测义务的执行进程(可能那也是它除了轻量以外的最大特征)。

# without delayed_job
Notifier.signup(@user).deliver

# with delayed_job
Notifier.delay.signup(@user)

# with delayed_job running at a specific time
Notifier.delay(run_at: 5.minutes.from_now).signup(@user)

Whenever

gem 'whenever', :require => false

Linux 里面有 Cron 可以协助我们定期执行一些任务,可是 Cron
手动写起来万分劳顿,尤其是前边时间周期的概念, Whenever
可以扶助大家用更人性化的法子编写 Cron 义务,看看出他的以身作则代码:

every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
  runner "SomeModel.ladeeda"
end

every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
  runner "Task.do_something_great"
end

every '0 0 27-31 * *' do
  command "echo 'you can use raw cron syntax too'"
end

# run this task only on servers with the :app role in Capistrano
# see Capistrano roles section below
every :day, :at => '12:20am', :roles => [:app] do
  rake "app_server:task"
end

它的 DSL 很简单,直接,暴力易懂!

自家个人是推荐使用 Resque 的。

上传组件

Paperclip

gem "paperclip", "~> 4.3"

Paperclip
是备受瞩目产品了,也是大约绝大多数档次都有在用它,它可以帮你处理上传图片,收缩,定义不一致的图片尺寸,大致很完善。(with
the support of ImageMagick)

# Rail4
class User < ActiveRecord::Base
  has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: ":style/missing.png"
  validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/
end

Carrierwave

gem 'carrierwave'

Carrierwave 是后来居上,成效和 Paperclip
差不离,但它还足以管理除图片之外的事物,而且灵活性更高。

对比

Paperclip 官方只协助 ActiveRecord 但相对稳定, 而 Carrierwave
相比灵活支持越多的 ORM, 比如 mongoid

If you feel adventurous, you can try
refile from the creators of
carrierwave.

表单

Rails
为大家带来和一改传统的表单构件格局,可是经过实际的施用,我们日益发现那样如故仍然不够“敏捷”,大家必要更加便利并有所更密切规范的表单,所以有了
Formtastic ,它用起来比 Rails 默认的 form
尤其简洁,可是却有所越来越多的功用,你可以为各类字段设定 help-text
放到文本框下边,并得以走 I18n 的法子设置语言。simple_form 和 Formtastic
功效类似,但它的写法还要简单一些。

SIMPLE_FORM

gem 'simple_form'

SimpleForm 在用法上与 Formtastic
类似,同样很好的协理了I18n、表间关联、嵌套表单和表单验证等常用的作用。SimpleForm
从 2.0 开首,在可定制性上有质的突破(推特(TWTR.US) Bootstrap
在里边起了很重点的效率),现在的它更像是一个 Form Builder
框架,可以很有利的对它举办安装和扩展。

看看 simple_form 的用法 :

= simple_form_for @user do |f|
  = f.input :username, label: 'Your username please'
  = f.input :password, hint: 'No special characters.'
  = f.input :email, placeholder: 'user@domain.com'
  = f.input :remember_me, inline_label: 'Yes, remember me'
  = f.button :submit

Formtastic

gem 'formtastic', '~> 3.0'

Formtastic
的机要弱点在于对HTML输出的可定制性上不够利索。如今的连串中,想要满意种种表单的需求,就须要在各样表单页写过多再一次的代码进行设置,甚至很多页面都在利用
Rails 原生的 Form Builder,那样做维护量太大。

  <%= semantic_form_for @post do |f| %>
    <%= f.inputs do %>
      <%= f.input :title %>
      <%= f.input :body %>
      <%= f.input :section, :as => :radio %>
      <%= f.input :categories %>
      <%= f.input :created_at, :as => :string %>
    <% end %>
    <%= f.actions do %>
      <%= f.action :submit, :as => :button %>
      <%= f.action :cancel, :as => :link %>
    <% end %>
  <% end %>

Grape

gem 'grape'

乘势 Mobile App 的伸张,很多时候大家在做用 Rails 做 API Base
项目时,rails 自带的 C 和 V 层显得过于繁杂,grape
能够协助大家疾速的创设和 Rails 完美融合的 API 接口。

module Twitter
  class API < Grape::API
    version 'v1', using: :header, vendor: 'twitter'
    format :json
    prefix :api

    helpers do
      def current_user
        @current_user ||= User.authorize!(env)
      end

      def authenticate!
        error!('401 Unauthorized', 401) unless current_user
      end
    end

    resource :statuses do
      desc 'Return a public timeline.'
      get :public_timeline do
        Status.limit(20)
      end

      desc 'Return a personal timeline.'
      get :home_timeline do
        authenticate!
        current_user.statuses.limit(20)
      end

      desc 'Return a status.'
      params do
        requires :id, type: Integer, desc: 'Status id.'
      end
      route_param :id do
        get do
          Status.find(params[:id])
        end
      end

      desc 'Create a status.'
      params do
        requires :status, type: String, desc: 'Your status.'
      end
      post do
        authenticate!
        Status.create!({
          user: current_user,
          text: params[:status]
        })
      end

      desc 'Update a status.'
      params do
        requires :id, type: String, desc: 'Status ID.'
        requires :status, type: String, desc: 'Your status.'
      end
      put ':id' do
        authenticate!
        current_user.statuses.find(params[:id]).update({
          user: current_user,
          text: params[:status]
        })
      end

      desc 'Delete a status.'
      params do
        requires :id, type: String, desc: 'Status ID.'
      end
      delete ':id' do
        authenticate!
        current_user.statuses.find(params[:id]).destroy
      end
    end
  end
end

CANCANCAN

gem 'cancancan', '~> 1.10'

它是 CanCan
项目的代替品,它其实就是为大家的运用进入操作权限控制,而且相比较好的地点是能够将有所的操作权限放在至到一个独立的公文之中。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end

而它的另一个相比新后来者就足以数
pundit 了,
由于在RubyGems上的下载量才7万多,所以就不独列出数了。但值得注意的是它在GitHub上的start是6K多,已超越CanCanCan的Repository。

万一有做过操作权限决定的仇敌或者都会发觉,操作极权限控制是很成本质量的,而
pundit 则称为在性质上会超过 CanCanCan,

Pundit
更为模块化,对于体量较大的次第我以为越来越之合适,至少不会写出一个几百行的大文件出来,不便于维护。

ActiveAdmin

gem 'activeadmin', github: 'activeadmin'

那是一个非凡不错的保管界面应用gem,
基本不须求做什么样须要就能上种类了。从RubyGems的百万级下载量也可以摸清其受欢迎的水准了。感觉上是有点仿
Wordpress 的 Dashboard。

自己个人是很喜爱 ActivateAdmin 的DSL定义的,因为既不难又飞速:

ActiveAdmin.register Product do
    scope :all, default: true
    scope :available
    scope :drafts

    filter :title
    filter :author, as: :select, collection: ->{ Product.authors }
    filter :price
    filter :create_at

    index do
        column :title
        column "Price", sortable: :price do |product|
            number_to_currency product.price
        end
        defualt_actions
    end
end 

如此这般的代码大概就是秒懂,不解释了。这家伙何人用哪个人说好 ^_^

他们的官网也做得挺好的,那里是有些关于 ActivateAdmin 的资源链接:

相关 gem

rails_admin

$ rails g rails_admin:install

与 ActiveAdmin 相比 rails_admin 就不如的多了,但在 GitHub
上却显示不俗。在代码质量上其实两边相去不远,只是 ActiveAdmin
更雅观一些,而 rails_admin
的界面就做得有点渣,要上类其余话无法不得作出很多的改动。

以下是 rails_admin 的特色:

  • 对任何数据都可支撑 CRUD
  • 自定义操作
  • 自动化表单验证
  • 支撑查找与过滤
  • 能够将数据导出为 CSV/JSON/XML 格式
  • 支撑 Devise 的身份验证
  • 支撑 CanCanCan 或 Pundit 的权杖判定
  • 由此 PaperTrail 支持用户操作历史
  • 帮助七种ORM
    • ActiveRecord
    • Mongoid

Sunspot

gem 'sunspot_rails'
gem 'sunspot_solr' # optional pre-packaged Solr distribution for use in development

Sunspot 是一个 Solr 搜索引擎的 Ruby 库。它依照 RSolr
库创设,提供低级其他 Solr
集成接口。它的概念很简单,使用也一定简单,用DSL就可索引对象和启用搜索了。

它的要紧特点:

  • 全文检索
  • ActiveRecord
  • 英文分词

ActivateRecord 定义 可一板一眼对象

class Post < ActiveRecord::Base
  searchable do
    text :title, :body
    text :comments do
      comments.map { |comment| comment.body }
    end

    boolean :featured
    integer :blog_id
    integer :author_id
    integer :category_ids, :multiple => true
    double  :average_rating
    time    :published_at
    time    :expired_at

    string  :sort_title do
      title.downcase.gsub(/^(an?|the)/, '')
    end
  end
end

搜索

Post.search do
  fulltext 'best pizza'

  with :blog_id, 1
  with(:published_at).less_than Time.now
  order_by :published_at, :desc
  paginate :page => 2, :per_page => 15
  facet :category_ids, :author_id
end

小结

自己那边没有列出 Rails 生成的那些常用 gem ,以上的都是局地自身采访和常用的
gem 希望能对我们有用。

除此以外,假若你收藏了更好的 gem 希望能在本文留评,而且请注脚 gem 的法力和
RubyGems 上的下载链接,给越多的Ruby的胃疼友一个综合性的资源集中,Thanks!

相关文章