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

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

ただいまの
回答率

90.47%

  • Ruby

    9654questions

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

【Ruby】errorの原因を見つけられずにいます。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 523

hh4437

score 8

前提・実現したいこと

Rubyを本で勉強している際に下記エラーが発生しました。
自分では何度見返しても原因がわからなかったので教えて頂きたいです。
(校正のような質問になってしまい恐縮です)

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

117:syntax error,unexpected keyword_end, expecting end-of-input

該当のソースコード

 #-*- coding utf-8 -*-

require'rubygems'
require'dbi'
require'date'

class BookInfo

def initialize (title,author,page,p_date)
  @title = title 
  @author = author
  @oage = page
  @p_date = p_date
end

attr_accessor :title, :author, :page, :p_date

    def to_s
        "#{@title},#{@author},#{@page},#{@p_date}"
    end

    def toFormattedString
        "タイトル : #{@title}\n書いた人 : #{@author}\nページ数 : #{@page}\n発行されたのは : #{@p_date}"
    end

end

class BookInfoManager

    def initialize (sqlite_name)
        @db_name = sqlite_name
        @dbh = DBI.connect("DBI:SQLite3:#{@db_name}")
    end

    def initBookInfos
        puts "\n0. データベースの初期化"
        print"初期化しますか?(Y/yなら削除を実行します)"
        yesno = gets.chomp.upcase
        if /^Y$/ =~ yesno
            @dbh.do("drop table if exists bookinfos")
            @dbh.do("create table bookinfos(id varvhar(50) not null, title varchar(100) not null, author varchar(100) not null, page int not null, 
                                p_date datetime not null,primary key(id));")
            puts "データを初期化しました"
        end
    end

    def addBookInfo
        puts "\n1. 蔵書データの登録"
        print "蔵書データを登録します"

        book_info = BookInfo.new("","",0,Date.new)
        print "\n"
        print "キーを入力してください : "
        key = gets.chomp
        print "本の名前を入力してください : "
        book_info.title = gets.chomp
        print "本の著者を入力してください : "
        book_info.author = gets.chomp
        print "本のページ数を入力してください : "
        book_info.page = gets.chomp.to_i
        print "発行された年(西暦)を入力してください : "
        year = gets.chomp.to_i
        print "発行された月(1~12)を入力してください : "
        month = gets.chomp.to_i
        print "発行された日(1~30)を入力してください : "
        day = gets.chomp.to_i
        book_info.p_date = Date.new(year,month,day)

        @dbh.do("insert into bookinfos values('#{key}','#{book_info.title}','#{book_info.author}','#{book_info.page}','#{book_info.p_date}');")
        puts "登録が完了しました"
    end

    def listAllBookInfos
        item_name = {'id' => "キー",'title' => "本の名前", 'author' => "著者", 'page' => "ページ数", 'p_date' => "発行された時期"}
        puts "\n2. データの一覧を表示します"
        print "蔵書データを表示します"
        puts "\n================"

        sth = @dbh.execute("select * from bookinfos")

        counts = 0
        sth.each.do |row|
            row.each_with_name do |val,name|
                puts "#{item_name[name]} : #{val.to_s}"
            end
            puts "================"
            counts = counts +1
        end

        sth.finish

        puts "\n#{counts}件の蔵書をすべて表示しました"        
    end

    def run
        while true
            print"0. 蔵書データベースの初期化\n1. 新しい蔵書の登録\n2. 蔵書データをすべて表示する\n9. このプログラムを終了する\n番号を選んでください(0,1,2,9)"

            num = gets.chomp

            case 
                when '0' == num
                    initBookInfos
                when '1' == num
                    addBookInfo
                when '2' == num
                    listAllBookInfos
                when '9' == num
                    @dbh.disconnect
                    puts "\n終了しました"
                    break;
                else
            end
        end
    end

end #←ここが117行目です。

book_info_manager = BookInfoManager.new("bookinfo_sqlite.db")
book_info_manager.run

試したこと

errorの言葉が何を表しているのか(syntax error は構文ミス等)は把握したのですがそれでもミスが見つかりません。
校正のような質問になってしまい恐縮ですが何卒宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

unexpectedをgoogle翻訳で見ると「予想外の」、「意外, 不測, 不意」となっています。
ブロックの開始/終了が一致していない状態の場合に表示されるメッセージと思ってよいと思います。
unexpected ')'unexpected '}'などもよくあるメッセージです。

今回の場合、h_aさんの回答にあるようにdef listAllBookInfosのsth.each.do |row|で、doが「.」でつながれているためにブロック開始のキーワードとして認識されず、endが余分に検出された状態となってエラーになっていると考えられます。

エラーメッセージがunexpected~のときはブロックの開始/終了が正しく一致しているかを探しましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/12 18:12

    分かりやすい説明、とても勉強になります。
    ありがとうございます。

    キャンセル

  • 2017/02/13 01:24

    丁寧な回答有難うございます!
    ご指摘いただいた内容を修正したところ、プログラムが動きました!

    キャンセル

+3

def listAllBookInfosのsth.each.do |row|という
書き間違えが原因かもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/13 01:24

    回答頂き有難うございます!
    ご指摘の行を修正した結果、無事動きました!

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    9654questions

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