Your posts match “ Googl ” tag:

Rails 4 + SettingsLogic + Googl 製作短網址功能

Why?

啊就因為專案需要啊,不然咧 ... XD

How?

請仔細看本教學

Okay, first?

各位可以到 https://github.com/hechien/example-short-url-rails clone 這個專案下來看看 :)

Requirements

我們會需要以上三個 Gem 套件,所以請在 Gemfile 中加上

gem 'settingslogic'
gem 'googl'

Okay, let's go!

第一次

在這個 Project 中我會建立一個 Article 來存文章,然後在儲存之後把文章網址轉為短網址。

打開 app/controllers/articles_controller.rb 然後在建立文章之後寫上

url = Googl.shorten(article_url(@article)).short_url
@article.update({ short_url: url })

Refactor 1

這樣就能夠把短網址弄出來了。

不過這樣寫其實挺亂的,所以我們拆出來另外寫。

def create
  respond_to do |format|
    if save_article
      format.html { redirect_to @article, notice: 'Article was successfully created.' }
      format.json { render action: 'show', status: :created, location: @article }
    else
      format.html { render action: 'new' }
      format.json { render json: @article.errors, status: :unprocessable_entity }
    end
  end
end

private

def save_article
    @article = Article.create(article_params)
  if @article.persisted?
    @article.update({ :short_url => Googl.shorten(article_url(@article)).short_url })
    return true
  end
  false
end

這樣的確乾淨多了,不過如果想要有一個監控 URL 點擊的次數的話可能就得登入自己的 Google 帳號,那這時候就得傳入自己的帳號密碼進去了,這邊我的資料是

(當然是假的,不必想登入)

加上帳密的寫法

client = Googl.client('foobar@gmail.com', 'foofoofoobarbarbar')
@article.update({ :short_url => client.shorten(article_url(@article)).short_url })

這樣一來就能使用登入過的帳號記錄了。

Refactor 2

可是,這樣子大家會看到帳號密碼啊 ... 安全性瞬間將到最低點!所以我們可以透過 SettingsLogic 來協助處理這件事。

建立 SettingsLogic model

app/models/ 底下建立一個 settings.rb

# app/models/settings.rb

class Settings < Settingslogic
  source "#{Rails.root}/config/application.yml"
  namespace Rails.env
end

建立 application.yml

然後,到 /config/ 底下建立 application.yml 這個檔案,並且輸入以下內容 (其實你可以用貼的)

# config/application.yml

defaults: &defaults

  googl:

    username: "foobar@gmail.com"

    password: "foofoofoobarbarbar"



development:

  <<: *defaults



test:

  <<: *defaults



production:

  <<: *defaults

存檔離開

修改 Googl 的設定方式

client = Googl.client(Settings.googl.username, Settings.googl.password)

好了,搞定,然後記得要在 .gitignore 裡面加上 /config/application.yml

蝦咪?你要把 application.yml 存到 Git 內?

嗯 ... 那還有一招,不過我們先把 /config/application.yml.gitignore 裡面移除吧!

然後,打開你的 application.yml 後,改為以下內容:

defaults: &defaults

  googl:

    username: <%= ENV["GOOGL_USERNAME"] %>

    password: <%= ENV["GOOGL_PASSWORD"] %>


development:

  <<: *defaults



test:

  <<: *defaults



production:

  <<: *defaults

然後再去設定環境變數,把帳號密碼設定進去就好了。

** UPDATED **

Refactor 3 - Service Object

xdite 建議拆成 Service Object 來處理,我就練習 & 筆記一下 XD

Steps

  1. app 資料夾底下建立一個 services 資料夾
  2. 新增 services/shorten_url.rb
  3. 新增底下的程式碼
    class ShortenUrl
    def initialize @client = Googl.client(Settings.googl.username, Settings.googl.password) end

    def shorten(url)
    @client.shorten(url).short_url
    end
    end


    1. 修改 app/controllers/articles_controller.rb
      def create
      @article = Article.new(article_params)
      respond_to do |format|
      if @article.save
        @article.update({ :short_url => ShortenUrl.instance.shorten(article_url(article)) })
      end
      end
      end
      
    2. 刪除掉最底下的 save_article

    我後來的版本還有替 ShortenUrl 加上 Singleton 功能,這個部分加不加就見仁見智了。