[Rails] 결제 기능의 간소화

16310 단어 pay.jpRubyRails
담당자 구하느라 바쁘겠다.
어떻게든 가져오고 싶어決済機能!
그런 분들이 봤으면 하는 기사!
이 글은 かんたん決済機能의 설치 방법을 소개했다.
여기서 말한 かんたん決済機能ワンクリックで決済「したことにする」 기능
투자조합에서 실현할 것을 구상하다.
단 한 가지 주의점이 있다.
이 글의 방법에는 Payjp 등外部APIには決済履歴이 없다.token 가상 프로덕션)
참고가 됐으면 좋겠어요.

전제 조건


주의: 본고는 신용 지불을 실시하지 않습니다!
개발 환경
・ruby2.6.5
・Rails 6.0.3.3

그림 완성



금액과 카드 정보를 입력하면 결제가 가능합니다.
 
이번에는 입력 없이 결제할 수 있는'심플 선물'버튼이 설치됐습니다!
(참고! 이 기사의 방법은 외부 API에 결제 내역을 저장하지 않습니다!)
 
여기서 말한 ギフト誰かが、誰かにお金を送る。라는 뜻이다.
 AさんがBさんに500円送った。이런 느낌!

ER 그림



이것은 선물로 필요한 탁자 두 개다
users 테이블
gifts 표
열에 대해서는 나중에 설명합니다.

실장 프로세스


① user,gift 모델,표 제작
② 라우팅 설정
③ 연관성 쓰기
④gifts 컨트롤러에서 동작 정의
⑤ 보기에서 링크 설정

① user,gift 모델,표 제작


사용자 모델의 이동 편집
사용자 모형은 devise로 제작되었습니다.devise 가져오지 않아도 괜찮아요!
db/migrate/xxxx_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      t.string :nickname,  null: false
      t.string :email,     null: false, default: ""
      #省略
    end
    #省略
  end
end
users표에 nicknameemail의 열을 준비했습니다.
gift 모형의 이동 편집
db/migrate/xxxx_create_gifts.rb
class CreateGifts < ActiveRecord::Migration[6.0]
  def change
    create_table :gifts do |t|
      t.references :user,  foreign_key: true
      t.references :giver, foreign_key: { to_table: :users }
      t.integer :price,    null: false
      t.timestamps
    end
  end
end
gifts표에는 user, giver, price 3개의 열이 준비되어 있다.
분별user   → ギフトを受け取る人 giver  → ギフトを送る人 price   → ギフトの金額를 입력합니다.
이번 결제는 이용자 간에 이뤄졌다.
한user는 여러 user에게 선물을 줄 수 있습니다.
따라서users 책상 사이에'다대다'의 관계를 맺어야 한다.
이번에는 giftsテーブル를 중간 테이블로 제작한다.
따라서 giftsテーブル는 다음과 같은 두 가지 작용을 한다.
・선물 정보 관리
・users표에 대응하는 중간표
저는 좀 이해가 안 가요.
잠시 후, 연관성을 기술할 때 잘 설명해야 합니다!
다음은 giver의 옵션을 설명합니다.giver 외부 키워드로 설정합니다.
하지만, giver 이 시계는 존재하지 않습니다!
그래서 "users 책상에서 참조하세요!"
알려줄 필요가 있어.
그래서 옵션에 foreign_key: { to_table: :users }라고 쓰여 있습니다.

② 라우팅 설정


config/routes.rb

Rails.application.routes.draw do
  resources :users, only: [:edit, :update, :show] do
    member do
      post 'easygift', to: 'gifts#easy_gift'
    end
  end
end
간단한 결제를 위해 경로를 기술했습니다.
path 이름은 easygift이지만 여기는 마음에 드는 이름으로 하면 돼요.
동작 이름도 자유롭게 결정할 수 있다.

③ 연관성 쓰기


사용자 모델
app/models/user.rb
class User < ApplicationRecord
  has_many :gifts
  has_many :receivers, through: :gifts, source: :giver
  has_many :reverse_of_gifts, class_name: 'Gift', foreign_key: 'giver_id'
  has_many :giftings, through: :reverse_of_gifts, source: :user
end
사용자 모델에 대한 관련 설명입니다.
크게 두 부분으로 나뉜다.
제1,2행 참조giver의 설명
3, 4행 참조user의 설명
먼저 1, 2행을 설명한다.has_many :gifts는 두 번째 줄에 대한 기술이다.
두 번째 줄이지만 순서대로 설명한다.has_many :receivers, through: :gifts, source: :giver receivers는 허구의 모형이다.
왜 허구의 모형을 만들었는지 이따가 설명해 주세요!through: :giftsgifts표 경유source: :giver
"참조giver!"라는 뜻이다.
총괄적으로 말하면, 제1, 2행에서
gifts표의 giver를 참조하세요!
이런 짓을 하다니!
 
다시 따라오세요!
 
다음은 3, 4행에 대한 설명입니다.
세 번째 줄이지만 길기 때문에 순서대로 하나를 설명합니다.has_many :reverse_of_gifts, class_name: 'Gift', foreign_key: 'giver_id' reverse_of_gifts도 허구의 모형이다.class_name: 'Gift'reverse_of_gifts라고 했는데, 사실gift모델의 일소라는 느낌이에요.foreign_key: 'giver_id'
"참조giver_id!"라는 뜻이다.
네 번째 줄도 하나하나 본다.has_many :giftings, through: :reverse_of_gifts, source: :user has_many :giftings도 허구의 모형이다.through: :reverse_of_gifts경유reverse_of_giftssource: :user
"참조user!"라는 뜻이다.
하는 일은 두 번째 줄과 같다.
총괄적으로 말하면 3, 4행에서
gifts표의 user를 참조하세요!
이런 짓을 하다니!
 
그렇다면 "왜 허구의 모형을 만들었을까?"라고 해설했다.
결론적으로 말하면
연관성을 구분할 수 없게 돼서!
내가 그 이유를 설명할게.
우선 연관된 최초의 사람들만 주목한다.
  has_many :gifts
  has_many :receivers
  has_many :reverse_of_gifts
  has_many :giftings
이렇게 되면 서로 다른 모델을 참고하는 것 같네요.
이어서 잠시 架空のモデルを作らなかった場合의 기술을 진행한다.
app/models/user.rb
class User < ApplicationRecord
  has_many :gifts
  has_many :users, through: :gifts, source: :giver
  has_many :gifts, foreign_key: 'giver_id'
  has_many :users, through: :gifts, source: :user
end
그리고 나서giftsテーブルを中間テーブルとするアソシエーションが、
2パターン記述されている
.
아까와 마찬가지로 연관된 최초의 사람들에게만 관심을 갖는다.
app/models/user.rb
class User < ApplicationRecord
  has_many :gifts
  has_many :users
  has_many :gifts
  has_many :users
end
어떤 건데!
알고 계셨습니까?
하면, 만약, 만약...
연관을 구분할 수 없습니다.
그렇게 되지 않도록 허구의 모형을 설치했다!
gift 모형
app/models/gift.rb
class Gift < ApplicationRecord
  belongs_to :user
  belongs_to :giver, class_name: 'User'

  attr_accessor :token

  validates :user_id, presence: true
  validates :giver_id, presence: true
  validates :price, presence: true
  validates :token, presence: true
end
giver의 옵션class_name: 'User'은 "user모델을 참고하세요!"라는 뜻이다.
유효성도 설정되어 있습니다.

④gifts 컨트롤러에서 동작 정의


간단한 결제 동작을 기술합니다.
app/controllers/gifts_controller.rb
class RoomsController < ApplicationController
    #省略
      def easy_gift
      reciver = User.find(params[:id])
      gift = Gift.create(
        price: 500,
        user_id: reciver.id,
        giver_id: current_user.id,
        token: 'dummy'
      )
      redirect_to root_path
    end
    #省略
end
이 글에서 실제 신용카드 지불에 대한 기술은 생략되었다.
참고 자료: payjp/payjp-ruby
 easy_gift는 라우팅에 정의된 작업 이름입니다.gift = Gift.create(...)에서 키마다 가치가 설정되어 있습니다.
여기서 주의해야 할 것은 token: 'dummy'입니다.
다른 열과 달리 token는 표에 저장되지 않습니다.
"그럼 token 가격을 안 줘도 되나요?"
이렇게 생각하는 사람, 나도 이렇게 웃는다
하지만 기억해 주세요!모형의 기술!
app/models/gift.rb
class Gift < ApplicationRecord
  belongs_to :user
  belongs_to :giver, class_name: 'User'

  attr_accessor :token

  validates :user_id, presence: true
  validates :giver_id, presence: true
  validates :price, presence: true
  validates :token, presence: true   # 👈tokenにバリデーションの設定している!
end
token에 설치된presence: true의 유효성.
따라서 선물을 생성할 때 없으면token검증 오류가 발생하여 선물을 기록으로 저장하지 않습니다.
따라서 가상token을 준비해야 한다.
이번에는 가치token'dummy'에 넘겼다.
가장 중요한 것은 실수가 발생하지 않도록 하는 것이다.
그러면 컨트롤러의 기술은 이것으로 끝냅니다.
 
마지막으로 보기에서 간단한 결제 링크를 설정합니다.

⑤ 보기에서 링크 설정


app/views/gifts/new.html.erb
<%= link_to '簡単ギフト', easygift_user_path(@reciver), method: :post %>
단추를 표시할 보기에서 링크를 설정합니다.
터미널에서 rails routes 명령을 사용하여 path를 찾습니다.
단말기
% rails routes

Prefix           Verb      URI Pattern                           Controller#Action
easygift_user        POST      /users/:id/easygift(.:format)         gifts#easy_gift
path는 컨트롤러 이름과 동작 이름에 대응합니다.
또한 URI Pattern에서 알 수 있듯이 id는 매개 변수로 전달해야 한다.
라우트를 users에 중첩하기 때문입니다.
이 프로그램은 id에 대응하는 @reciver를 매개 변수로 전달합니다.

이렇게 실현하면 완성된다.
끝까지 함께 해주셔서 감사합니다!

참고 자료


Active Record 검증 가이드

좋은 웹페이지 즐겨찾기