[Rails] 결제 기능의 간소화
어떻게든 가져오고 싶어
決済機能
!그런 분들이 봤으면 하는 기사!
이 글은
かんたん決済機能
의 설치 방법을 소개했다.여기서 말한
かんたん決済機能
란ワンクリックで決済「したことにする」
기능투자조합에서 실현할 것을 구상하다.
단 한 가지 주의점이 있다.
이 글의 방법에는 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표에 nickname
와 email
의 열을 준비했습니다.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: :gifts
gifts표 경유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_gifts
표source: :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 검증 가이드
Reference
이 문제에 관하여([Rails] 결제 기능의 간소화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kobachii/items/d5bdd1572c203b4e347b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)