H30秋基本情報技術者試験問3システム(随時加筆
2019年3,4月の間はエンジニアの下で、Rubyを中心に色々学んだ。
その中で、H30秋基本情報技術者試験問3のコンサートに則したサイトを実際に作っていた。
5月以降も勉強しながら、少しずつ機能等を追加していたが、アウトプットしていなかった。
いつかまたRubyonRailsで似たことをするとき用に書き残しておこう。
参照
自分のサイト
コンサート問題のGithubレポジトリ
GithubPages
自分の関連アウトプット
21日目:H30秋基本情報技術者試験の問3データベース
プログラミングを2か月間、セブで学んできた
トランザクション(Paymentコントローラ)
エンジニアの下で学び、仕組みを理解し、アウトプット18日目:トランザクションって
を書いてはいたが、深くまで理解しておらず、実装時にてこずった。
コンサートチケットの支払い時の、ポイント使用・追加あたりの、Paymentコントローラ内に実装。
※※※なお、Userテーブルに所持金カラムを追加してないので
トランザクションの流れ
- ユーザはポイントUser.pointを持っている。
- 購入時にUser.pointの一部/全部を支払額Sale.amountに充てることができる。
- 使用ポイントSale.used_pointが更新される
- 支払額から使用したUser.pointを引いたものが、決済額Payment.amountとなる。
- 決済額Payment.amountのうち、既定の割合が付与ポイントPayment.added_pointとなる。
- ユーザのポイント残高は、(支払前の)
User.point - Sale.used_point + Payment.added_point
で更新される。
支払い完了の条件
- User.point、Sale.used_point、Payment.added_pointは全て0以上(>=0)
- モデル側のバリデーション
validates :point, numericality: { greater_than_or_equal_to: 0 }
利用
- モデル側のバリデーション
- User.point >= Sale.used_point
- Falseとなる操作は悪意しかないので、トランザクション外のif文で
実装自体
User.point、Sale.used_point、Payment.added_pointは全て0以上(>=0)
validates :point, numericality: { greater_than_or_equal_to: 0 } # User
validates :used_point, numericality: { greater_than_or_equal_to: 0 } # Sale
validates :added_point, numericality: { greater_than_or_equal_to: 0 } # Payment
def payment
@user = 割愛
@sale = 割愛
@concert = 割愛
@payment = Payment.new(sale_id: @sale.id, date: Date.current)
respond_to do |format|
if current_user.point < params_used_point
# 所持ポイントを超過している旨の警告文 (以下、ポイントをPと略す)
else # 所持P範囲内で支払おうとしている場合
begin
ActiveRecord::Base.transaction do
if @sale.amount <= params_used_point # 使用Pが販売額を超えてる時。
@sale.update!(used_point: @sale.amount)
@payment.update(amount: 0, added_point: 0) # 支払成功。決済額が0なので、追加Pもゼロ
else
@sale.update!(used_point: params_used_point)
@payment.update!(amount: pay_amount, added_point: 追加P計算関数)
end
@user.update!(point: ユーザP更新関数)
# 支払い完了と表示
end
rescue StandardError => e # トランザクション失敗したら
logger.error e
logger.error e.backtrace.join("\n")
@sale = 割愛
@concert = 割愛
format.html { render :confirm, notice: 'エラー' }
end
end
end
end
まあ、駄目な部分もあると思う。が、まあ、
Githubセキュリティアラート
nokogiriに関するセキュリティアラートが来ていた。
nokogiri。。。Gemfileには書いてない。Gemfile.lockの方のみ。
確か、Gemfile.lockには、Gemfileには書いてなくても依存関係にあるものは、書かれるのだから、今回はその他gemがnokogiriに依存しているのだろう。
今回はbundle update
が適当だろう。
-
gem update
- gem コマンドは Gemfile や Gemfile.lock とは無関係に動作
- 被インストールgemについて,より新しいバージョンがあれば最新版をインストール
-
bundle update
- Gemfile と Gemfile.lock に基づいて動作
bundle update nokogiri
git add -i
git commit -m 'update nokogiri'
git push origin master'
セキュリティアラート消えた。
Author And Source
この問題について(H30秋基本情報技術者試験問3システム(随時加筆), 我々は、より多くの情報をここで見つけました https://qiita.com/OriverK/items/4e71ebd81a6ef372dcf9著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .