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

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

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

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

368閲覧

ruby学習中にて以下のエラーが出て次に進めません、、、。

ken1203

総合スコア24

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2020/05/01 06:28

編集2020/05/01 09:39

前提・実現したいこと

行いたい項目を選択してください
[1]点数を登録する
[2]点数を確認する
[3]終了する
1
生徒名を入力してください
山田
生徒の年齢を入力してください
22
国語の得点は?
33
数学の得点は?
44
英語の得点は?
55
行いたい項目を選択してください
[1]点数を登録する
[2]点数を確認する
[3]終了する

ここに質問の内容を詳しく書いてください。
2を押すと次のようなエラーが出てきます。

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

エラーメッセージ
test.rb:21:in show_student_name': undefined local variable or method student' for main:Object (NameError)

該当のソースコード

ruby

ソースコード
def registration_student

student = {}
puts '生徒名を入力してください'
student[:name] = gets.chomp
puts '生徒の年齢を入力してください'
student[:age] = gets.to_i
puts "国語の得点は?"
japanese_score = gets.to_i
puts "数学の得点は?"
math_score = gets.to_i
puts "英語の得点は?"
english_score = gets.to_i
end

def show_student_name

i = 0
student.each do |student|
puts "#{i}: #{student[:name]}"
i += 1
end

puts '見たい生徒の番号を入力してください'
num = gets.to_i

input = gets.to_i - 1
person = data[input]
puts "名前: #{person[:name]}"
puts "年齢: #{person[:age]}"
puts "国語: #{person[:japanese_score]}"
puts "数学: #{person[:math_score]}"
puts "英語: #{person[:english_score]}"
end

students = []

while true
puts '行いたい項目を選択してください'
puts '[1]点数を登録する'
puts '[2]点数を確認する'
puts '[3]終了する'
input = gets.to_i
puts input
if input == 1
registration_student
elsif input == 2
show_student_name
elsif input == 3
exit
else
puts '無効な値です'
end
end

試したこと

理解できなくて試していません。

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

kazto

2020/05/01 06:40

ソースコードは省略せずすべて記載しましょう。
Yasumichi

2020/05/01 07:27

```ここに言語名を入力 上記の「ここに言語名を入力」を ruby に変更してください。あと、end が一個足りてないと思われます。
ken1203

2020/05/01 09:29

ありがとうございます。訂正します。
Yasumichi

2020/05/01 10:10

ソースコードを以下のように囲むと読みやすくなります。 ```ruby ソース本体 ``` 対応しているMarkdownの記法を知りたい https://teratail.com/help#about-markdown の「コードを入力」を参照してください。  この記法は、GitHub や Qiita 等でも使用できるので覚えておいて損はないかと。
ken1203

2020/05/01 10:24

ありがとうございます。 本当に無知で恥ずかしいです。 勉強します!
guest

回答1

0

ベストアンサー

undefined local variable or method とは「ローカル変数もしくはメソッドが未定義」という意味です。

変数の scope の問題ですね。def show_student_name において、student は宣言されていないので

ruby

1student.each do |student|

の所でエラーが出ています。変数の使い方を全般に見直す必要がありそうです。

以下は、あまりグローバル変数は使いたくないですが、とりあえず、動くようにしてみたバージョンです。

ruby

1$students = [] 2 3def registration_student 4 5 student = {} 6 puts '生徒名を入力してください' 7 student[:name] = gets.chomp 8 puts '生徒の年齢を入力してください' 9 student[:age] = gets.to_i 10 puts "国語の得点は?" 11 student[:japanese_score] = gets.to_i 12 puts "数学の得点は?" 13 student[:math_score] = gets.to_i 14 puts "英語の得点は?" 15 student[:english_score] = gets.to_i 16 $students.push(student) 17end 18 19def show_student_name 20 21 i = 0 22 $students.each do |student| 23 puts "#{i}: #{student[:name]}" 24 i += 1 25 end 26 27 puts '見たい生徒の番号を入力してください' 28 num = gets.to_i 29 30 input = gets.to_i - 1 31 person = $students[input] 32 puts "名前: #{person[:name]}" 33 puts "年齢: #{person[:age]}" 34 puts "国語: #{person[:japanese_score]}" 35 puts "数学: #{person[:math_score]}" 36 puts "英語: #{person[:english_score]}" 37end 38 39while true 40 puts '行いたい項目を選択してください' 41 puts '[1]点数を登録する' 42 puts '[2]点数を確認する' 43 puts '[3]終了する' 44 input = gets.to_i 45 puts input 46 if input == 1 47 registration_student 48 elsif input == 2 49 show_student_name 50 elsif input == 3 51 exit 52 else 53 puts '無効な値です' 54 end 55end
  • students をグローバル変数にした。
  • student.each → $students.each
  • japanese_score 以降、student[:japanese_score]に変更。
  • registration_student の最後に $students.push(student) を実行
  • person = data[input] → person = $students[input] 同様に未定義となったため。

投稿2020/05/01 10:06

編集2020/05/01 10:30
Yasumichi

総合スコア1773

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

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

ken1203

2020/05/01 10:29

ありがとうございます! もう一度試してみます!!
ken1203

2020/05/01 11:01

ターミナルにて動作確認出来ました! 分かりやすく丁寧な回答をありがとうございます! まだまだ勉強不足です、、。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問