スクールでのチーム開発にて詰まった箇所を共有します。
●バージョン
ruby 2.5.3
Rails 5.2.4.2
詰まった箇所
チーム開発中のフリーマーケットアプリにて、アプリ全てのページに適用するheaderをview/layout/_header.html.hamlで作成。
上記ファイルに、items.controllerで以下のインスタンス変数をビューに渡し、ancestryを導入しカテゴリーのプルダウンメニューを実装。
その後、ログイン画面へ移動した際にエラーとなる。
以下、順番にコードを記載。
#items_controller.rb
def index
@parents = Category.all.order("id ASC").limit(13)
end
ancestryを導入し、カテゴリー実装、headerにてjQueryを使用したプルダウンメニューを作成。
以下は、_header.html.hamlの記述。
.head__in__nav__left__cate
カテゴリー
%ul.category1
- @parents.each do |parent|
%li.parent__list
= link_to parent.name
%ul.category2
- parent.children.each do |child|
%li.child__list
=link_to child.name
%ul.category3
- child.children.each do |grandchild|
%li.grandchild__list
= link_to grandchild.name
インデックスページではプルダウンメニューは問題なく動作。
https://gyazo.com/ce06546f7171b6814d343099c952770d
ここまで完成し、ログインして商品出品関連の実装に入ろうとしたところ以下のエラーと遭遇。
https://gyazo.com/ff22ac1a2e297e90f61cdf407c62c7e4
Devise::session#newで@parentsがnilと言われている。
確かに、今のままでは、items.controllerの範囲内でしか@parentsが飛ばせていない。
解決策
application_controllerに以下を記載することで解消
before_action :set_category, if: :devise_controller?
def set_category
@parents = Category.all.order("id ASC").limit(13)
end
if: :devise_controller?とすることで、deviseが動くときは必ず@poarentsが作成される形で記述しエラーは解消。
最終的には、アプリ全体で使用するheaderのため、if: :devise_controller?不要になると思われる。
このあたりはチームメンバーと相談して検討しようと思います。
最後に
解決してみれば当たり前すぎる結論だったのですが、自身で検索した際に目ぼしい情報に巡り合えなかったので、共有のため記事を投稿しました。
上記の他にも、deviseコントローラーを作成し、Devise::session#new等で@parentsを設定する形も可能ですが、わざわざこの記述のためだけに設定するのは大袈裟かと却下。
また、viewファイル内で@parentsを設定する方法もありましたが、コントローラーの役割をビューで
行うのもどうかとなり、上記結論に行き着きました。