天天看點

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

在這裡,值得推薦的 ruby on rails 的 web 開發的插件包括 capistrano 和 foreigner。

我用 ruby on rails 開發已經有很多年了,用這個優秀的架構我完成了很多任務,其中有些可以算是非常複雜的項目。基于我的經驗,我來推薦一些我覺得非常有用的 gem。本文就會分享這個推薦清單,還會告訴你如何找到 ror 有用的 gem。

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

不幸的是,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 &lt; 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 &lt; 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 &lt; activerecord::base 

mount_uploader :logo, retailerlogouploader 

retailer = retailer.new 

file.open('logo.jpg') { |f| retailer.logo = f } 

retailer.save! 

retailer.logo.url # =&gt; '/url/to/logo.png' 

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

urlify

用于将 diacritic 字元串轉換為 ascii-safe uri 字元串的一個簡單且易于使用的 gem。在安裝好這個 gem 之後,你可以為任何東西調用 urlify 函數,它将會立即被轉換為一個等價的相容 uri。

urlify.urlify('kj?le test') #=&gt; kjoele_test 

或:

urlify.urlify('kj?le test', '-') #=&gt; 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      #=&gt; "ukraine" 

c.alpha2#=&gt; "uk" c.alpha3#=&gt; "ukr" 

c.longitude #=&gt; "49 00 n" 

c.latitude  #=&gt; "32 00 e" 

以下為關于如何擷取貨币資訊的代碼:

c.currency.code   #=&gt; "uah" 

c.currency.symbol #=&gt; "?" 

c.currency.name   #=&gt; "hryvnia" 

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

c.in_eu? #=&gt; 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的權限:

&lt;% if can? :update, @article %&gt; &lt;%= link_to "edit", edit_article_path(@article) %&gt; &lt;% end %&gt;

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

def show   

  @article = article.find(params[:id])   

  authorize! :read, @article 

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

你可以使用下面的方式來catch由 cancan::accessdenied抛出的異常來處理有關權限認證方面的錯誤:

class applicationcontroller &lt; actioncontroller::base  

rescue_from cancan::accessdenied do |exception|  

redirect_to root_url, :alert =&gt; exception.message  

其它資訊可以在 github 上的文檔中找到。

formtastic

&lt;%= semantic_form_for @post do |f| %&gt;  

&lt;%= f.inputs "basic", :id =&gt; "basic" do %&gt;  

&lt;%= f.input :title %&gt;  

&lt;%= f.input :body %&gt;  

&lt;% end %&gt;  

&lt;%= f.inputs :name =&gt; "advanced options", :id =&gt; "advanced" do %&gt;  

&lt;%= f.input :slug, :label =&gt; "url title", :hint =&gt; "created automatically if left blank", :required =&gt; false %&gt;  

&lt;%= f.input :section, :as =&gt; :radio %&gt;  

&lt;%= f.input :user, :label =&gt; "author" %&gt;  

&lt;%= f.input :categories, :required =&gt; false %&gt;  

&lt;%= f.input :created_at, :as =&gt; :string, :label =&gt; "publication date", :required =&gt; false %&gt;  

&lt;% end %&gt; 

&lt;%= f.actions do %&gt; 

&lt;%= f.action :submit %&gt;  

你也可以使用嵌套的資源:

&lt;%= semantic_form_for [@author, @post] do |f| %&gt; 

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

&lt;%= semantic_form_for @post do |f| %&gt; 

&lt;%= f.inputs :title, :body, :created_at %&gt;  

&lt;%= f.inputs :first_name, :last_name, :for =&gt; :author, :name =&gt; "author" %&gt;  

&lt;%= f.actions %&gt; 

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

class stringinput &lt; formtastic::inputs::stringinput  

def to_html 

puts "this is my modified version of stringinput" 

super 

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

class flexibletextinput &lt; formtastic::inputs::stringinput  

def input_html_options  

super.merge(:class =&gt; "flexible-text-area") 

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

class datepickerinput  

include formtastic::inputs::base 

使用方式:

:as =&gt; :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