為 Web 開發提供的 10 個 Ruby on Rails Gems
在這裡,值得推薦的 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 列表之一。
letter_opener
事實上,一個簡單而有用的 gem,它是儲存資料夾電子郵箱的一個外掛而不是傳送它們。通過啟用這個 gem,你必須設定 letter_opener 作為應用配置中的遞交方式(例如在 config/enviroments/development.rb之中)
太好啦!現在所有發出去的訊息將被存貯在 /tmp/letter_opener
資料夾裡,並且新的電子郵箱被髮送之後會在瀏覽器中預覽。它簡單且實際。
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 文件選項能被找到。
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'
此外,也可以改變上傳影像的品質,對它進行剪裁,加密檔案以及在執行中做更多的事情,在上傳時 – 所有這一切都可以在文件中找到。
Urlify
用於將 diacritic 字串轉換為 ASCII-safe URI 字串的一個簡單且易於使用的 gem。在安裝好這個 gem 之後,你可以為任何東西呼叫 urlify 函式,它將會立即被轉換為一個等價的相容 URI。
URLify.urlify('Kj?le Test') #=> kjoele_test
或:
URLify.urlify('Kj?le Test', '-') #=> kjoele-test
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' }
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')
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 上的文件中找到。
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 的關聯以及其他很多特性,具體參考文件。
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
參閱所有可能的引數文件,更多關於定義任務的詳細細節,請連線該外掛和其他東西。
好啦,我們來回顧十個最有用的 Ruby on rails gems,該是我的故事將要大結局了,我希望你能找到這個有用的資訊。在我與 Evgeniy Maslov 合作而發表的“Ruby on rails 之中的 eway 支付閘道器整合”文章裡,你將閱讀更多關於 Ruby on rails。謝謝你們,再見了,親愛的讀者。
相關文章
- 10 個必備而且非常有用的 Ruby on Rails 4 GemsAI
- Node.js vs Ruby on Rails:哪個最適合Web開發?Node.jsAIWeb
- 使用 Ruby on Rails 開發 Go 介面AIGo
- 開發新手最容易犯的50個 Ruby on Rails 錯誤(1)AI
- rails on ruby,ruby on rails 之程式碼塊(二)AI
- 12 款不可錯過的開源 Ruby on Rails 開發工具AI
- 在Windows下配置Ruby on Rails開發環境WindowsAI開發環境
- 從底層去認識 ruby 的load,require,gems,bundler,以及rails中的autoloadingUIAI
- [ruby] rails renderAI
- Windows平臺下快速搭建Ruby on Rails的開發環境WindowsAI開發環境
- Ruby on Rails 生成指定版本的 Rails 專案AI
- Ruby On Rails 另一個笑談而已AI
- SOA結束了大型程式的年代 為Ruby on Rails敞開大門AI
- 為Ruby On Rails開發者準備的5款IDEAIIDE
- ruby on rails 小技巧AI
- Ruby on Rails 相關AI
- Ruby On Rails 技術AI
- 如何提高 Ruby On Rails 的效能?AI
- Ruby on rails開發從頭來(windows)(三十三)- 命名約定AIWindows
- 在Ruby on Rails/Naked Objects精神指引下的域驅動開發框架AIObject框架
- Ruby開發人員應該熟悉的10個工具
- Ruby on Rails Ping ++ 支付AI
- do |r| Ruby & Rails endAI
- 什麼是 Ruby on Rails?AI
- 如何提高 Ruby On Rails 效能AI
- java 和 Ruby On Rails的對比JavaAI
- Ruby on Rails:開源技術將深入企業AI
- 淺析Ruby的備選Web開發框架CubaWeb框架
- ruby on rails筆記和理解AI筆記
- ruby on rails 伺服器配置AI伺服器
- Ruby on Rails?有人會用嗎?AI
- .nil? .empty? .blank? .present? in Ruby on RailsAI
- Rails並不是用Ruby編寫的AI
- 強大的Rails/Ruby開發工具:JetBrains RubyMine 2023 for macAIMac
- 5 個常見的 Rails 開發誤區AI
- 提升 Web開發效能的 10 個技巧Web
- PlayJam:為250家開發商提供100%分成
- Ruby on Rails Mountable vs. Full EngineAI