為 Web 開發提供的 10 個 Ruby on Rails Gems

oschina發表於2016-01-02

在這裡,值得推薦的 Ruby on Rails 的 web 開發的外掛包括 Capistrano 和 Foreigner。

我用 Ruby on Rails 開發已經有很多年了,用這個優秀的框架我完成了很多工,其中有些可以算是非常複雜的專案。基於我的經驗,我來推薦一些我覺得非常有用的 gem。本文就會分享這個推薦列表,還會告訴你如何找到 RoR 有用的 gem。

不幸的是,gem 的格式描述不支援分類和標籤。所以我們不得不期望 gem 的作者在描述裡列出我們需要的關鍵字,這樣在搜尋的時候才能更好的得到結果。你可以在 rubygems.org 或者 github.com 上找到很多 gem。可以通過描述去進行搜尋(GitHub 上你還可以在語言列表中選上 Ruby)

另一個值得介紹的是 Ruby Toolbox。它可以讓你按分類和熱度進行搜尋。不過不要僅依賴這個工具,因為 Ruby Toolbox 的作者是手工新增新的 gem 的。

Foreigner

這個 gem 可以幫你建立表的外來鍵,它非常容易使用。你只需要簡單的把它加到 Gemfile,它會為你的 migrations 增加兩個方法 :add_foreign_key 和 remove_foreign_key。當然,你也可以使用這兩個方法在 create_table 和 change_table 的時候新增或刪除 key。

假設我們需要新增一個 key,這個 key 從 comment 表指向 posts 表。我們可以這樣做:

class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
# … t.references :post
# ...
t.foreign_key :posts
end
# …
end
end

這些方法有一些額外的選項,例如 name,column,dependent。你可以參考文件

也許有人會認為,準確的說這個 gem 並非只適用於 Rails 的新版本,不過它確實是只有 4.2 以上的版本才支援的(其實之前已經有第三方的支援了)。總之,我認為這個 gem 屬於最有用的 gem 列表之一。

專案的 GitHub 連結

letter_opener

事實上,一個簡單而有用的 gem,它是儲存資料夾電子郵箱的一個外掛而不是傳送它們。通過啟用這個 gem,你必須設定 letter_opener 作為應用配置中的遞交方式(例如在 config/enviroments/development.rb之中)

太好啦!現在所有發出去的訊息將被存貯在 /tmp/letter_opener

資料夾裡,並且新的電子郵箱被髮送之後會在瀏覽器中預覽。它簡單且實際。

請連結到Github

Kaminari

該 gem 允許你很容易的建立任一複雜性的 paginators 模組。Kaminari 支援幾個ORMs(ActiveRecord,Mongoid,MongoMapper)以及模板引擎(ERB,Haml,Slim)。

Kaminari 並不巢狀基礎類:如 array,hash,Object 以及 ActiveRecord::Base。

讓我們開始使用 Kaminari 吧,把它放在 gem 檔案中,已經足夠啦。某些功能變成可用之後,例如:頁,每個以及對齊。現在,你可以藉助於Kaminari.paginate_陣列方法,來輕鬆地把你的陣列轉換成一個分頁模組,然後許多有用的分頁功能將可以訪問。

@paginatable_array = Kaminari.paginate_array(my_array_object).page(params[:page]).per(10)

預設的配置將被生成在 Kaminari· 配置初始化程式中。

default_per_page, max_per_page, max_pages – 這是一個簡要的能被設定的選項列表。

除此之外,該分頁的每個模組能被獨立的配置。

class User < ActiveRecord::Base 
paginates_per 50
end

如果你需要定製 paginator,你可以通過執行一個生成器來建立模板:

% rails g kaminari:views default # -e haml - if you want to use  HAML template engine.

該模板將被建立於 app/views/kaminari/ 之中,現在,你可以輕鬆地編輯他們。

本地化(I18n)標籤,主題和友好的 urls,以及其他有用的 gem 文件選項能被找到。

請連結到 Github

CarrierWave

使用 CarrierWave 讓你能夠從你的 RoR 應用程式中上傳任何檔案。所有你需要做的事情如下:

建立一個 uploader:

rails generate uploader ProductPhotoUploader

新增一些選項:

class ProductPhotoUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
def store_dir
"product_images"
end
def extension_white_list
%w(jpg jpeg gif png)
end
def filename
Digest::SHA1.hexdigest(self.read) + File.extname(original_filename)
end
end

你已經可以使用 uploader 在儲存器中儲存檔案了。

uploader = ProductPhotoUploader.new
uploader.store!(my_file)

CarrierWave 還允許你在臨時儲存、檔案系統、甚至是雲空間中儲存檔案。

你可以將 CarrierWave uploader 連線到 AR(還有其他 ORM 介面卡)模型,並通過在資料庫中儲存一條記錄來儲存你的檔案:

class Retailer < ActiveRecord::Base
mount_uploader :logo, RetailerLogoUploader
end
retailer = Retailer.new
File.open('logo.jpg') { |f| retailer.logo = f }
retailer.save!
retailer.logo.url # => '/url/to/logo.png'

此外,也可以改變上傳影像的品質,對它進行剪裁,加密檔案以及在執行中做更多的事情,在上傳時 – 所有這一切都可以在文件中找到。

訪問專案的 GitHub 連結

Urlify

用於將 diacritic 字串轉換為 ASCII-safe URI 字串的一個簡單且易於使用的 gem。在安裝好這個 gem 之後,你可以為任何東西呼叫 urlify 函式,它將會立即被轉換為一個等價的相容 URI。

URLify.urlify('Kj?le Test') #=> kjoele_test

或:

URLify.urlify('Kj?le Test', '-') #=> kjoele-test

訪問專案的 GitHub 連結

WickedPdf

WickedPdf 是一個用於將 html 生成為 PDF 的 RoR 外掛。在新增這個 gem 之後,你需要做以下步驟:

建立初始化:

rails generate wicked_pdf

註冊 mine-type:

Mime::Type.register "application/pdf", :pdf

考慮到這個 gem 使用了 wkhtmltopdf,所以應該在 gem 的設定中指定其路徑。

WickedPdf.config = { exe_path: '/usr/local/bin/wkhtmltopdf' }

訪問該專案的 GitHub 連結

Countries

如果你面臨著需要處理關於不同國家的資訊的任務,這個 gem 將會提供你解決這個問題所需要的所有資料。有按國家名稱和區域搜尋,貨幣資訊(符號,程式碼),各種形式的電話號碼,座標等功能。所有這一切需要你在安裝它之後建立一個 country 物件(或者從一個全域性 helper 中獲取),然後你就可以得出必要的資訊了:

c = ISO3166::Country.new('UA')
# or to use global helper  = Country['UA']
c.name      #=> "Ukraine"
c.alpha2#=> "UK" c.alpha3#=> "UKR"
c.longitude #=> "49 00 N"
c.latitude  #=> "32 00 E"

以下為關於如何獲取貨幣資訊的程式碼:

c.currency.code   #=> "UAH"
c.currency.symbol #=> "?"
c.currency.name   #=> "Hryvnia"

或者檢查該國是否為歐盟成員:

c.in_eu? #=> false

以下為通過名稱以及貨幣程式碼搜尋國家的示例:

c = ISO3166::Country.find_country_by_name('Ukraine') 
c = ISO3166::Country.find_country_by_currency('UAH')

訪問該專案的 GitHub 連結

CanCanCan

這個庫讓你可以很方便的在 RoR 中配置許可權。使用它你可以很容易的實現對特定資源的訪問的限制。其便利之處在於許可權的管理是跟使用者分離的,而且所有的許可權都儲存在一個單獨的地方。這就是為什麼你不用再控制器、檢視和資料庫請求中重複地做一些事情。

這個庫需要在控制器中定義一個 current_user 方法。所以你首先要對身份認證資訊進行配置(這次我用到了 Devise, 不過其它的gem也可以做到)。然後. Then, generate an ability:

rails g cancan:ability

使用 :read, :create, :update 和 :destroy 這些命令來指定使用者許可權 (can/cannot 方法), (你可以在文件中找到更多)。

class Article::Ability  
  include CanCan::Ability
  def initialize(user)
case user   
  when Admin     
    cannot :manage, :profile     
    can :read, :all       
  when Moderator     
    can :manage, [Apartment, RoomPrice], { lessor_id: user.id }        
    can :manage, Photo, { photographer_id: user.id }     
    can :manage, Lessor, { id: user.id }     
    can :manage, :profile 
end
  end
end

之後,在檢視中你可以使用 can? 和 cannot? 輔助方法來檢查當前使用者對於給定action的許可權:

<% if can? :update, @article %> <%= link_to "Edit", edit_article_path(@article) %> <% end %>

你還可以使用 authorize! 來對控制器中的action進行許可權認證:

def show  
  @article = Article.find(params[:id])  
  authorize! :read, @article
end

或者你也用到前置過濾器 load_and_authorize_resource, 它會載入資源同時嘗試對其進行許可權認證。

你可以使用下面的方式來catch由 CanCan::AccessDenied丟擲的異常來處理有關許可權認證方面的錯誤:

class ApplicationController < ActionController::Base 
rescue_from CanCan::AccessDenied do |exception| 
redirect_to root_url, :alert => exception.message 
end
end

其它資訊可以在 GitHub 上的文件中找到。

連結到 GitHub.

Formtastic

該 gem 提供很棒的 DSL 支援,讓你可以很容易的構建出漂亮直觀的基於語義的 rich form,它提供的 DSL 很容易上手:只需要在一個 Semantic_form_for 程式碼塊裡列出所有的欄位,然後就可以得到一個漂亮的 form:

<%= semantic_form_for @post do |f| %> 
<%= f.inputs "Basic", :id => "basic" do %> 
<%= f.input :title %> 
<%= f.input :body %> 
<% end %> 
<%= f.inputs :name => "Advanced Options", :id => "advanced" do %> 
<%= f.input :slug, :label => "URL Title", :hint => "Created automatically if left blank", :required => false %> 
<%= f.input :section, :as => :radio %> 
<%= f.input :user, :label => "Author" %> 
<%= f.input :categories, :required => false %> 
<%= f.input :created_at, :as => :string, :label => "Publication Date", :required => false %> 
<% end %>
<%= f.actions do %>
<%= f.action :submit %> 
<% end %>
<% end %>

你也可以使用巢狀的資源:

<%= semantic_form_for [@author, @post] do |f| %>

也支援巢狀的 form。你可以使用 f.semantic_form_for(Rails 風格),不過 Formtastic 風格的寫法更好看一些,你可以使用 :for 選項。

<%= semantic_form_for @post do |f| %>
<%= f.inputs :title, :body, :created_at %> 
<%= f.inputs :first_name, :last_name, :for => :author, :name => "Author" %> 
<%= f.actions %>
<% end %>

你可以很容易的更改 input 的行為:

class StringInput < Formtastic::Inputs::StringInput 
def to_html
puts "this is my modified version of StringInput"
super
end
end

基於已有的input建立自己的input:

class FlexibleTextInput < Formtastic::Inputs::StringInput 
def input_html_options 
super.merge(:class => "flexible-text-area")
end
end

或者建立一個全新的 input 型別:

class DatePickerInput 
include Formtastic::Inputs::Base
def to_html
# ...
end
end

使用方式:

 :as => :date_picker

Formtastic 支援相當多的 input 型別 (select, check_boxes, radio, time_zone, datetime_select, range),基本及高階的本地化,belongs_to,has_many和has_and_belongs_to_many 的關聯以及其他很多特性,具體參考文件

GitHub 的專案連結

Capistrano

該工具允許在多個遠端機器上通過 ssh 的併發來執行命令。此 gem 容易使用 DSL。它使您能夠定義將應用於某些角色機器的任務,並且通過閘道器機器來支援隧道連線。

開啟 gem 之後,你必須執行:

bundle exec cap install
通過配置建立資料夾

如果你將使用不同的環境,你必須增加 STAGES 引數,例如:STAGES = local, sandbox, qa, production。執行一個 cap 指令碼,使用該命令-

bundle exec cap [environments separated by gaps] [command]。例如,將部署看起來就如此的舞臺環境:

bundle exec cap staging deploy

Capistrano DSL 通過 Rake 來借用。以下是該任務的一個簡單例子:

server 'example.com', roles: [:web, :app]
server 'example.org', roles: [:db, :workers]
desc "Report Uptimes"
task :uptime do 
on roles(:all) do |host|
execute :any_command, "with args", :here, "and here"
info "Host #{host} (#{host.roles.to_a.join(', ')}):/t#{capture(:uptime)}"
end
end

參閱所有可能的引數文件,更多關於定義任務的詳細細節,請連線該外掛和其他東西。

連結到Github。

好啦,我們來回顧十個最有用的 Ruby on rails gems,該是我的故事將要大結局了,我希望你能找到這個有用的資訊。在我與 Evgeniy Maslov 合作而發表的“Ruby on rails 之中的 eway 支付閘道器整合”文章裡,你將閱讀更多關於 Ruby on rails。謝謝你們,再見了,親愛的讀者。

相關文章