NoMethodError in View#group_selectでエラーが出た時の対処法

NoMethodError in View#group_selectでエラーが出た時の対処法画像

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を使用していても、

railsさん
booksなんていうメソッドなんかない!

と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

最後に

エラーと戦ううちに、解消するのに時間がかからなくなってきました。最初は赤い画面を見るのも嫌でしたが、解消してちゃんと動くと嬉しいものですね。

[参考にしたサイト]