BootstrapRuby On Rails 常用之精品Gem汇总

先是得注明一点,本文是原创的并无是自从任何地方转载。所有的数码是自我自
GitHub 和 RubyGems 上码下来的,数据的截取时间虽是本文的颁布日期。

RubyGems 的下载量可以看出于就此这个 gem
的人数,所以数值很非常(这里收藏的下载量至少会压倒10万级)。而在 GitHub
上的虽表示关注这gem的源码的食指(本文收藏之起码是过 1k上述 Star 的
repository)

Nokogiri

  • RubyGems
    下充斥总数:54,800,674
  • GitHub
    • Star: 3,572
    • Fork: 502

gem 'nokogiri'

集数据是我们得分析复杂的 HTML 结构,从中获得待之数,Nokogiri
可以辅助我们全面的处理不同网页端不同的 HTML
结构,并且发生格外好的编码处理能力,用它们若不要担心页面是 GB2312 还是 GBK
还是 UTF-8,它还特别充分好之处理,解析结构可以用接近 jQuery 的 CSS Selector
的法门查找,很是便宜。曾经为此了 Ruby 的某些单近乎插件,最终发现 Nokogiri
才是无限好的。

Faraday

  • RubyGems
    下充斥总数:22,988,969
  • GitHub
    • Star: 2,868
    • Fork: 422

gem 'faraday', '~> 0.9.1'

Faraday 是一个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

  • RubyGems
    下充斥总数:17,006,673
  • GitHub
    • Star 2,584
    • Fork 507

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

  • RubyGems
    下充斥总数:13,825,106
  • GitHub
    • Star: 14,085
    • Fork: 3,085

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, Facebook, 新浪微博, 腾讯
    QQ)账号登陆的支撑。
  • Confirmable: 发送邮件以说明注册用户之身价。
  • Recoverable: 支持密码重置。
  • Registerable:支持注册新用户。
  • Rememberable: 支持自动登录
  • Trackable: 可跟踪用户的登入次数,时间穿和 IP
  • Timeoutable: 支持活动用户会话的过
  • Validatable: 可验证用户之邮件的以及密码的正确,且可定制化。
  • Lockable: 可以锁定多次尝试登录失败的用户账号。

苟没它,光想要我们友好来码上面的这些意义还够浪费时间的。重点是每个类别还得用啊。

FACTORY_GIRL_RAILS

  • RubyGems
    下充斥总数:10,848,852
  • GitHub
    • Star: 1,427
    • Fork: 158

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

  • RubyGems
    下充斥总数:4,889,904
  • GitHub
    • Star: 5,472
    • Fork: 329

gem "better_errors"

它用一个重好之,更管用的错页替换标准的 Rails 错误页面,对 Rack
middleware 也同等有效。

Bootstrap 1

4百大多万的下载,可见美观是雅会掀起我们这些外观第一底程序员的。

twitter-bootstrap-rails

  • RubyGems
    下充斥总数:1,999,464
  • GitHub
    • Star: 4,242
    • Fork: 1,019

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

来自 Twitter 的 Bootstrap,是相同模仿好的前台 CSS
框架。以简洁,优雅著称于海内外。被广大攻城狮所青睐,又受洋洋次猿审美疲劳。不用特别啊~

分页控件

will_paginate

  • RubyGems
    下充斥总数:9,644,696
  • GitHub
    • Star: 4,556
    • Fork:703

gem 'will_paginate', '~> 3.0.6'

Kaminari

  • RubyGems
    下充斥总数:9,257,070
  • GitHub
    • Star: 5,420
    • Fork:735

gem 'kaminari'

Kaminari 支持多底 ORM (ActiveRecord, Mongoid) 和多的Web框架 (Rails,
Sinatra, Grape), 以及强底模版引擎 (ERB, Haml, Slim).

自打数字达到双方都不过于次之间,只是will_paginate 比较老, 应用案例较多,
kaminari 更新, 性能与兼容性更好。

计划任务

偶然有些职责的行会那个缓慢,而这些职责我们连无求要立即赶回结果
(比如:发送邮件,生成图片缩略图),那我们可择以这些任务放到后台执行,以便让页面不见面添加时待执行,我们还是以那个统称为计划任务吧。

于这上面的有多可观之 gem, 其粉丝吧不少

Resque

  • RubyGems 下充斥总数: 6,039,413
  • GitHub
    • Star: 6,976
    • Fork:1,295

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

  • RubyGems 下充斥总数:
    5,192,392
  • GitHub
    • Star: 5,748
    • Fork:976

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

  • RubyGems
    下充斥总数:4,893,701
  • GitHub
    • Star: 3,687
    • Fork:1,025

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

  • RubyGems
    下充斥总数:4,552,611
  • GitHub
    • Star: 5,977
    • Fork: 537

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

  • RubyGems
    下充斥总数:9,552,376
  • GitHub
    • Star: 7,474
    • Fork:1,644

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

  • RubyGems
    下充斥总数:5,739,234
  • GitHub
    • Star: 6,279
    • Fork:1,098

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

  • RubyGems
    下充斥总数:5,590,175
  • GitHub
    • Star: 5,673
    • Fork: 921

gem 'simple_form'

SimpleForm 在用法及同 Formtastic
类似,同样煞好的支持了I18n、表间关联、嵌套表单和表单验证等常用之力量。SimpleForm
从 2.0 开始,在可定制性上有质的突破(Twitter 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

  • RubyGems
    下充斥总数:3,939,154
  • GitHub
    • Star: 4,771
    • Fork:588

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

  • RubyGems 下充斥总数:1,723,845
  • GitHub
    • Star: 6,836
    • Fork: 784

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

  • RubyGems
    下充斥总数:1,398,259
  • GitHub
    • Star: 2,546
    • Fork:244

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

  • RubyGems
    下充斥总数:1,382,453
  • GitHub
    • Star: 6,361
    • Fork: 2,281

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 的资源链接:

  • 网站: http://www.activeadmin.info
  • 以线示例: http://demo.activeadmin.info/admin

相关 gem

rails_admin

  • RubyGems
    下充斥总数:760,942
  • GitHub
    • Star: 5,702
    • Fork: 1,639

$ 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

  • RubyGems
    下充斥总数:1,261,400
  • GitHub
    • Star: 2,454
    • Fork: 787

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!

相关文章