62日目終了。
↓今日やったこと
・フリマアプリ パンくず機能実装!
昨日苦戦していたのですが、神ページを見つけて完成させることができました!これです→https://qiita.com/Iwa_tech/items/61d1681687739faffab0
昨日は変数を渡すことばっかり考えていましたが、渡すのではなく生成すれば良いということが分かりました!
ちょっと理解が難しいところがありましたので、上のページの補足説明をしていきたいと思います。(ある程度gretelの仕様を把握されている方向けです。)
【Rails】パンくず機能実装(gretel使用)補足説明
上のページを参考に自分はこんな感じでbreadcrums.rbを作りました。
config/breadcrumbs.rb
# config/breadcrumbs.rb crumb :root do link "FURIMA", root_path end crumb :categories do link "カテゴリー一覧", categories_path parent :root end crumb :parent do |category| category = Category.find(params[:id]).root link category.name, parent_category_path(category) parent :categories end crumb :child do |category| category = Category.find(params[:id]) # 表示ページが子カテゴリーの一覧ページの場合 if category.has_children? link category.name, child_category_path(category) parent :parent else # 表示ページが孫カテゴリーの一覧ページの場合 link category.parent.name, child_category_path(category.parent) parent :parent end end crumb :grandchild do |category| category = Category.find(params[:id]) link category.name, grandchild_category_path(category) parent :child end
使用Viewファイル
index.html.haml (categories#index) #カテゴリー一覧 parent.html.haml (categories#parent) #親カテゴリー child.html.haml (categories#child) #子カテゴリー grandchild.html.haml (categories#grandchild) #孫カテゴリー
ポイント1
各viewファイルでbreadcrumbsを呼んであげる必要があります。
表示したいところに下記コード記述。(僕は何故かindexだけでいいと勘違いしていました。)
(例)parent.html.haml の親カテゴリーviewファイルにて - breadcrumb :parent # ← crumbで名付けた名前 = breadcrumbs separator: " › "
ポイント2
読み込んだviewファイルによってcategory変数(breadcrums.rb内)の値が変わります。
上のbreadcrums.rbコードでchildだけ場合分けされているのがこのためです。
childでは子カテゴリーを表示している場合は、category = 子カテゴリーとなっていますが、孫カテゴリーを表示している場合のchildは、category = 孫カテゴリーとなっています。
そのため、category.parent = 子カテゴリーとして場合分けする必要があります。
ここで、なぜparentは場合分けしなくてもいいの?と疑問に思った方もいると思います。
場合分けしなくても良い理由は、parentは .root をつけて生成しているからです。
category = Category.find(params[:id]).root
こうすることで、子カテゴリーでも孫カテゴリーでも表示していても、その一番大元にあたる親を取得できるのです!なのでparentは場合分けの必要がありません。
一応自分的に閃いて、.root.childrenにすればchildも場合分けしなくてもいいんじゃね?と思ってやってみたのですが、値を取得できませんでした・・・_| ̄|○
なので場合わけは必須かと思います。
パンくずに迷える子羊にとって役に立てば幸いです。
ではまた明日!