TH's Notes
  • Home
  • Categories
  • Tags
  • Archives

使用 Concerns 幫 Model 瘦身

設定模組路徑

在 config/application.rb 加入

config.autoload_paths += %W(#{Rails.root}/lib) # module paths

來告訴 Rails 自動載入專案 lib 下的 module files

抽出可共用的邏輯

假設我們有一個 Invitation model, 裡面定義了 token 的產生和清除

app/models/invitation.rb:

class Invitation < ActiveRecord::Base

  before_create :generate_token # 在 create 前自動產生 token

  belongs_to :inviter, class_name:"User"
  validates_presence_of :recipient_name, :recipient_email, :message

  def generate_token # 產生 token
    self.token = SecureRandom.urlsafe_base64
  end

  def clear_token # 清除 token
    self.update_column(:token, nil)
  end

end

這時候我們可以考慮使用 ActiveSupport::Concern 將 token 處理的相關邏輯抽離出來並封裝成一個模組,如下

lib/tokenable.rb:

module Tokenable
  extend ActiveSupport:: Concern

  included do
    before_create :generate_token
  end

  def generate_token
    self.token = SecureRandom.urlsafe_base64
  end

  def clear_token
    self.update_column(:token, nil)
  end

end

然後,原先的 model 就可以改寫成

app/models/invitation.rb:

class Invitation < ActiveRecord::Base

  include Tokenable # 處理 token

  belongs_to :inviter, class_name:"User"
  validates_presence_of :recipient_name, :recipient_email, :message

end

正如所見,改寫後的 model 變得更加簡潔; 此外,倘若其他 model 需要同樣功能時,也可以很方便地調用已封裝好的模組。 對於此議題,在 DHH 的文章中有更詳細的討論。

Comments
comments powered by Disqus

  • « 在網站中加入 Invite 功能
  • Heroku 上的郵件服務: Mailgun »

Published

Jan 9, 2015

Category

Web

Tags

  • rails 63
  • Powered by Pelican. Theme: Elegant by Talha Mansoor