質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

817閲覧

データの保存忘れを防ぐために警告を表示する処理を施したい。

popyRon

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2020/05/27 08:34

前提・実現したいこと

Ruby初心者です。
現在簡単な蔵書管理アプリを作成しています。
実行すると初期化、登録、表示、別ファイルへ保存、終了を選択することができます。
入力したデータを保存せずに終了しようとすると警告が表示されるような処理を実装してみたいのですが、何をどうしたらいいやら全く見当がつきません。

助力お願いいたします。

発生している問題・エラーメッセージ

該当のソースコード

Ruby

1require 'date' 2 3class BookInfo 4 attr_accessor :title, :author, :pages, :publish_date 5 def initialize(title, author, pages, publish_date) 6 @title = title 7 @author = author 8 @pages = pages 9 @publish_date = publish_date 10 end 11 12 def to_s 13 "#{@title},#{@author},#{@pages},#{@publish_date}" 14 end 15 16 def toFormattedString(sep="\n") 17 "書籍名:#{@title}#{sep}著者名:#{@author}#{sep}ページ数:#{@pages.to_s}#{sep}発刊日:#{@publish_date.to_s}#{sep}" 18 end 19end 20 21 22class BookInfoManager 23 24 def initialize(csv_fname = "book_info.csv") 25 @book_infos = [] 26 @csv_fname = csv_fname 27 if File.exist?(@csv_fname) 28 open(@csv_fname, "r") do |file| 29 file.each do |line| 30 title, author, pages, publish_date = line.chomp.split(",") 31 @book_infos << BookInfo.new( title, author, pages.to_i, Date.parse(publish_date)) 32 end 33 end 34 end 35 end 36 37 def addBookInfo 38 book_info = BookInfo.new("", "", 0, Date.new) 39 print "書籍名:" 40 book_info.title = gets.chomp 41 print "著者名:" 42 book_info.author = gets.chomp 43 print "ページ数:" 44 book_info.pages = gets.chomp.to_i 45 print "発刊年:" 46 year = gets.chomp.to_i 47 print "発刊月:" 48 month = gets.chomp.to_i 49 print "発刊日:" 50 day = gets.chomp.to_i 51 book_info.publish_date = Date.new( year, month, day) 52 53 @book_infos << book_info 54 end 55 56 def listAllBookInfos 57 @book_infos.each do |info| 58 print info.toFormattedString 59 end 60 end 61 62 def saveAllBookInfos 63 open(csv_fname = "book_info.csv", "w") do |file| 64 @book_infos.each do |book| 65 file.puts book.to_s 66 end 67 end 68 end 69 70 def run 71 while true 72 print "蔵書管理アプリ 73 0. 蔵書データベースの初期化 74 1. 蔵書データの登録 75 2. 蔵書データの表示 76 8.蔵書データをファイルへ保存 77 9. 終了 78 番号を選んでください(0, 1, 2, 8, 9):" 79 80 num = gets.chomp 81 82 case num 83 when '0' 84 initialize 85 when '1' 86 addBookInfo 87 when '2' 88 listAllBookInfos 89 when '8' 90 saveAllBookInfos 91 when '9' 92 break 93 end 94 end 95 end 96end 97 98bim = BookInfoManager.new() 99bim.run

試したこと

1でデータを追加した場合のみ、9を押した際に事前に8で保存していなければ警告メッセージを表示したいのですが、思ったより複雑で何をどうしたらいいかわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

@dirty_flag (名前は適当) ってのを用意して、最初は false、登録したら true、保存したら false にするようにして、終了時にこの値をチェックして警告を出せば良いのでは。

diff

1 class BookInfoManager 2 3 def initialize(csv_fname = "book_info.csv") 4 @book_infos = [] 5 @csv_fname = csv_fname 6+ @dirty_flag = false 7 # 略 8 end 9 10 def addBookInfo 11 # 略 12 13 @book_infos << book_info 14+ @dirty_flag = true 15 end 16 17 def saveAllBookInfos 18 open(csv_fname = "book_info.csv", "w") do |file| 19 @book_infos.each do |book| 20 file.puts book.to_s 21 end 22 end 23+ @dirty_flag = false 24 end 25 26 def run 27 while true 28 # 略 29 30 case num 31 # 略 32 when '9' 33+ if @dirty_flag 34+ print "保存してない変更は失われます。よろしいですか?" 35+ next if gets.chomp != "y" 36+ end 37 break 38 end 39 end 40 end 41 end

投稿2020/05/27 08:51

hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popyRon

2020/05/27 10:56

感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問