発生した問題
ルーティング(routes.rb)とビュー(answer.html.erb)の間で値渡しを行うコントローラーを記述していた際に問題が発生しました。
エラーメッセージ
undefined method `-' for "1":String Did you mean? -@
ネットでググり、「undefined method」これは初歩的なスペミスか、定義されていない変数やクラスへのアクセスなどの可能性がある、という情報は理解しました。しかし「-」(マイナス)がメソッドとして「undefined」という意味に戸惑い、状況が理解できませんでした。
question_and_answers_controller.rb
def answer
@course = params[:course]
@scene = params[:scene]
question_number = (@course - 1) * 5 + @scene
qa = QuestionAndAnswer.find_by(id: question_number)
@answer = qa.answer
@next_scene = @scene + 1
end
routes.rb
Rails.application.routes.draw do
get 'answer/:course/:scene' => 'question_and_answers#answer'
なぜ数値の1が"1"と文字扱いになっているのかもわかりませんでした。
しかしここにヒントがありました。
単純にシンプルに理解し、文字と認識されているなら、と数値に変換してみました。
question_and_answers_controller.rb
def answer
@course = params[:course].to_i
@scene = params[:scene].to_i
question_number = (@course - 1) * 5 + @scene
qa = QuestionAndAnswer.find_by(id: question_number)
@answer = qa.answer
@next_scene = @scene + 1
end
これでうまくいきました。ルーティングのアドレスで渡される値は文字として認識されているということがわかり、新たな気づきがありました。
今後は気をつけたいと思います。