6

學習如何包gem

 2 years ago
source link: https://blog.niclin.tw/2015/12/13/%E5%AD%B8%E7%BF%92%E5%A6%82%E4%BD%95%E5%8C%85gem/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Nic Lin's Blog

喜歡在地上滾的工程師

這是一個新增Facebook讚與留言的功能 我們將他實作在


def social_plugin(plugin_name, options)
  width  = options.delete(:width)
  height = options.delete(:height)
  style  = "border:none; overflow:hidden; width:#{width}px; height:#{height}px;"
  src    = "http://www.facebook.com/plugins/#{plugin_name}.php?#{options.to_param}"

  content_tag(:iframe, "", src: src, scrolling: "no", frameborder: "0", style: style, 
              allowtransparency: "true")
end

def fb_like(like_url, custom_options={})
  options = {
    href: like_url,
    send: false,
    layout: "button_count",
    show_faces: false,
    width: 90
  }

  options.merge! custom_options

  social_plugin("like", options)
end

def fb_comments(url, custom_options={})
  options = {
    href: url,
    num_posts: 10
  }

  options.merge! custom_options

  social_plugin("comments", options)
end

然後把這二個功能放入到app/views/products/show.html.erb 螢幕快照 2015-12-14 上午12.10.05 1.png

before

螢幕快照 2015-12-14 上午12.11.39.png

after

螢幕快照 2015-12-14 上午12.13.03.png

現在我們想把這個 helper 拆出來,包到 Gem 裡面,讓我以後不用再做這些設定,直接在 view 去用它就好

bundle fb_like_comment

螢幕快照 2015-12-14 上午12.17.32.png

找出這個gem的路徑

螢幕快照 2015-12-14 上午12.18.22.png

安裝在你的 Rails 專案裡面, 設定 path: xxx <== 只抓取你本機端的資料夾

螢幕快照 2015-12-14 上午12.19.58.png

在跑bundel install之前 必須先把你創建的gem裡面的xxx.gemspec檔案作一些小修改 不然直接跑bundle install會跳錯誤

螢幕快照 2015-12-14 上午12.42.21.png

這裡的gem以fb_like_comment作示範

...
spec.summary       = "修改為任意內容"
spec.description   = "修改為任意內容"
...

接下來跑bundle install可以看到已經將我們自己製作的gem加入了

螢幕快照 2015-12-14 上午12.48.32.png

設定 dependency ‘railries’

gem的根目錄裡面的xxx.gemspec必須加入

spec.add_dependency “railties”

...
+  spec.add_development_dependency "railties"
...

Gem 的資料夾跑 bundle install, 把這個 gem 讀進去

設定 railties.rb

建一個新檔案: lib/fb_like_comment/railtie.rb

module SampleGemHelper
  class Railtie < Rails::Railtie
    initializer "SampleGemHelper.view_helpers" do
      ActionView::Base.send :include, FbLikeComment
    end
  end
end

把一開始在 Rails 新做的功能丟進去


require "fb_like_comment/version"
require "fb_like_comment/railtie" if defined?(Rails)

module FbLikeComment
def social_plugin(plugin_name, options)
    width  = options.delete(:width)
    height = options.delete(:height)
    style  = "border:none; overflow:hidden; width:#{width}px; height:#{height}px;"
    src    = "http://www.facebook.com/plugins/#{plugin_name}.php?#{options.to_param}"

    content_tag(:iframe, "", src: src, scrolling: "no", frameborder: "0", style: style,
                allowtransparency: "true")
  end

  def fb_like(like_url, custom_options={})
    options = {
      href: like_url,
      send: false,
      layout: "button_count",
      show_faces: false,
      width: 90
    }

    options.merge! custom_options

    social_plugin("like", options)
  end

  def fb_comments(url, custom_options={})
    options = {
      href: url,
      num_posts: 10
    }

    options.merge! custom_options

    social_plugin("comments", options)
  end
end

把原本寫在 rails 的 application_helper 移除掉, 並把 rails 重新跑 bundle install + rails s

若設定有錯誤,就會在 bundle install 這邊出現錯誤

這樣基本的 Gem 就完成了

把寫好的gem push到github上面就可以給別人使用囉

以後要給別人用,直接請它安裝

gem "fb_like_comment", github: "niclin/fb_like_comment"

就可以直接使用了!!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK