NoMethodError in View#group_selectでエラーが出た時の対処法
どうも、フリーランス目指して奮闘中のYuta(@Yuta)です。
Railsチュートリアルが終わったので、よりRailsへの理解を深めるためにRuby on Rails 5アプリケーションプログラミングを購入。
サクサクと進められていたのですが、
第4章ビュー開発
- 選択ボックスの選択肢をグループ化する
でエラーが発生。30分ほど詰まってしまいました。
調べた結果、無事解決。アウトプットのためにこの記事を書くことにしました。
初心者の方でもし同じところで詰まっている方がいたら、今回の記事を参考にしてもらえると嬉しいです。
rails sでサーバーを起動し、URLを入力するものの…
書籍の内容通りに進めていき、ブラウザで反映結果を実行しようとするものの、以下のエラーが発生。
このエラーを調べてみると、次のようなF&Qサイトを見つけました。
モデル側で、アソシエーションの設定が行われていないのではないかと
思われます。サンプルコードを一式まとめて(ファイル
単位ではなく)コピーした上でご確認願います。
FAQ[Ruby on Rails 3 アプリケーションプログラミング]
アソシエーションってなんだ?と思ったのでQiitaで調査。
アソシエーションとは
【Rails初心者向け】モデル間の関連付け(アソシエーション)まとめテーブル間リレーションシップをモデル上の関係として扱う仕組み です。
【アソシエーション = モデル間の関連付け】
といった具合に認識しておけば良いのではないかと思います。
このエラー発生時のコードはこちら。
今回の場合だと、group_selectとbooksが関連づけられていません。引数としてbooksを使用していても、
[speech_bubble type=”ln” subtype=”R1″ icon=”rails-logo.png” name=”railsさん”]booksなんていうメソッドなんかない![/speech_bubble]
とrailsさんに怒られているわけです。
このエラーを解消するためには、belongs_toとhas_manyを使って、booksモデルとAuthorモデルの関連付けが必要。
belongs_toとhas_manyってなんだ?
belongs_toとは、
参照元テーブルから参照先テーブルの情報を取得するためのアソシエーション
です。
今回の場合なら、booksが参照元テーブルでAuthorが参照先のテーブルになりますね。関係性を作ることで、いちいちbooksモデルのコードを書かなくてもちゃんとデータを取得してくれるようになります。
逆にhas_manyとは、
参照元テーブルから複数の参照先テーブルの情報を取得できるアソシエーション
です。(has_manyは[1対多の関係]とも言われますね。)
最終的なエラー解消コードは以下になります。
僕もこれは知らなかったのですが、belongs_toとhas_manyは同時に表記できるようですね。
has_and_belongs_to_many
最後に
エラーと戦ううちに、解消するのに時間がかからなくなってきました。最初は赤い画面を見るのも嫌でしたが、解消してちゃんと動くと嬉しいものですね。
[参考にしたサイト]