Rails を使った EC アプリケーション開発について学べる本 "Take My Money" を読んだ

読みました。

どんな本か


 "Accepting Payments on the Web"  (payment)  Web  The Pragmatic Bookshelf 

 Rails 5 使*1


























PCI DSS 




2017-01  Slack  EC

2pragprg.com 


EC Rails  gem 

 gem 使



1 tickets_count 
# 採用しない例
create_table "tickets" do |t|
  # ...
  t.integer "tickets_count"
  t.integer "price_cents", default: 0, null: false
end

status  enum  unsold, sold 
# 採用する例
create_table "tickets" do |t|
  # ...
  t.integer "status"
  t.integer "price_cents", default: 0, null: false
end














create_table "payments" do |t|
  # ...
  t.integer "user_id"
  t.integer "price_cents", default: 0, null: false
  t.integer "status"
  t.string  "payment_method"
  t.json    "full_response"
end

2


payments 

 price_cents  payments 







 JSON 


1 payment 
change_table "payments" do |t|
  t.references :original_payment, index: true
end

ER

workflow 


workflow  app/workflows 
# app/controllers/shopping_carts_controller.rb
class ShppingCartsController < ApplicationController
  def update
    # performance はある映画のある時間における上映
    workflow = AddsToCart.new(user: current_user, performance: performance, count: params[:ticket_count])
    workflow.run # workflow に実際のロジックを委譲する
    # ...
  end
end

# app/workflows/adds_to_cart.rb
class AddsToCart
  # initialize など...
  def run
    # 実際にカートへ商品を追加するロジックを書く
  end
end

調 Trailblazer  Operation 


EC Stripe  PayPal  workflow  workflow  workflow 
# app/workflows/purchases_cart.rb
class PurchasesCart
  # ...
  def run
    update_tichets
    create_payment
    purchase
    calculate_success
  end
end

# app/workflows/purchases_cart_via_stripe.rb
class PurchasesCartViaStripe < PurchasesCart
  def purchase
    # Stripe の Web API クライアントを使って決済
  end
end

# app/workflows/purchases_cart_via_pay_pal.rb
class PurchasesCartViaPayPal < PurchasesCart
  def purchase
    # PayPal の Web API クライアントを使って決済
  end
end

 workflow  create_workflow 使
class PaymentsController < ApplicationController
  # ...
  def create
    workflow = create_workflow(params[:payment_type]) # ビューからの payment_type で具象 workflow 作成
    workflow.run
    # ...
  end

  private

  def create_workflow(payment_type)
    case payment_type
    when "paypal"
      PurchasesCartViaPayPal.new( # 引数
      )
    else
      PurchasesCartViaStripe.new( # 引数
      )
    end
  end
end

 gem


 gem  gem 


money-rails

 API  money  gem  Rails 



Administrate

Thoughtbot 

 ActiveAdmin 使



Pundit

Policy 



PaperTrail

ActiveRecord 



bundler-audit

 gem  Gemfile.lock 




EC

*1:「クライアントサイド、サーバサイド両方 Rails 5 を使って開発しています」と書いていましたが、表現がよくないので修正しました