在這裡,值得推薦的 ruby on rails 的 web 開發的插件包括 capistrano 和 foreigner。
我用 ruby on rails 開發已經有很多年了,用這個優秀的架構我完成了很多任務,其中有些可以算是非常複雜的項目。基于我的經驗,我來推薦一些我覺得非常有用的 gem。本文就會分享這個推薦清單,還會告訴你如何找到 ror 有用的 gem。
不幸的是,gem 的格式描述不支援分類和标簽。是以我們不得不期望 gem
的作者在描述裡列出我們需要的關鍵字,這樣在搜尋的時候才能更好的得到結果。你可以在 rubygems.org 或者 github.com
上找到很多 gem。可以通過描述去進行搜尋(github 上你還可以在語言清單中選上 ruby)
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
# …
也許有人會認為,準确的說這個 gem 并非隻适用于 rails 的新版本,不過它确實是隻有 4.2 以上的版本才支援的(其實之前已經有第三方的支援了)。總之,我認為這個 gem 屬于最有用的 gem 清單之一。
<a target="_blank" href="https://github.com/matthuhiggins/foreigner">項目的 github 連結</a>
letter_opener
太好啦!現在所有發出去的消息将被存貯在 /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
如果你需要定制 paginator,你可以通過運作一個生成器來建立模闆:
% rails g kaminari:views default # -e haml - if you want to use haml template engine.
該模闆将被建立于 app/views/kaminari/ 之中,現在,你可以輕松地編輯他們。
本地化(i18n)标簽,主題和友好的 urls,以及其他有用的 gem 文檔選項能被找到。
<a target="_blank" href="https://github.com/amatsuda/kaminari">請連結到 github</a>
carrierwave
使用 carrierwave 讓你能夠從你的 ror 應用程式中上傳任何檔案。所有你需要做的事情如下:
建立一個 uploader:
rails generate uploader productphotouploader
添加一些選項:
class productphotouploader < carrierwave::uploader::base
include carrierwave::minimagick
storage :file
def store_dir
"product_images"
def extension_white_list
%w(jpg jpeg gif png)
def filename
digest::sha1.hexdigest(self.read) + file.extname(original_filename)
你已經可以使用 uploader 在存儲器中儲存檔案了。
uploader = productphotouploader.new
uploader.store!(my_file)
carrierwave 還允許你在臨時存儲、檔案系統、甚至是雲空間中儲存檔案。
你可以将 carrierwave uploader 連接配接到 ar(還有其他 orm 擴充卡)模型,并通過在資料庫中儲存一條記錄來存儲你的檔案:
class retailer < activerecord::base
mount_uploader :logo, retailerlogouploader
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
之後,在視圖中你可以使用 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
或者你也用到前置過濾器 load_and_authorize_resource, 它會加載資源同時嘗試對其進行權限認證。
你可以使用下面的方式來catch由 cancan::accessdenied抛出的異常來處理有關權限認證方面的錯誤:
class applicationcontroller < actioncontroller::base
rescue_from cancan::accessdenied do |exception|
redirect_to root_url, :alert => exception.message
其它資訊可以在 github 上的文檔中找到。
formtastic
<%= 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 %>
你也可以使用嵌套的資源:
<%= 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 %>
你可以很容易的更改 input 的行為:
class stringinput < formtastic::inputs::stringinput
def to_html
puts "this is my modified version of stringinput"
super
基于已有的input建立自己的input:
class flexibletextinput < formtastic::inputs::stringinput
def input_html_options
super.merge(:class => "flexible-text-area")
或者建立一個全新的 input 類型:
class datepickerinput
include formtastic::inputs::base
使用方式:
: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)}"
<a target="_blank" href="https://github.com/capistrano/capistrano">連結到github。</a>
來源:51cto