euphonictechnologies’s diary

Haskell超初心者の日記です。OCamlが好きです。

follow us in feedly

Rails - administrateはどうやってナビゲーションバーを作っているのか

ごく

私的なメモです

ナビゲーションバーはどこへ?

./vendor/bundle/ruby/2.4.0/gems/administrate-0.8.1/app/views/administrate/application/_navigation.html.erb

どんなコード?

administrate/_navigation.html.erb at master · thoughtbot/administrate · GitHub

<nav class="navigation" role="navigation">
  <% Administrate::Namespace.new(namespace).resources.each do |resource| %>
    <%= link_to(
      display_resource_name(resource),
      [namespace, resource.path],
      class: "navigation__link navigation__link--#{nav_link_state(resource)}"
    ) %>
  <% end %>
</nav>

Administrate::Namespace.new(namespace).resourcesの中身は?

./vendor/bundle/ruby/2.4.0/gems/administrate-0.8.1/lib/administrate/namespace.rb

どんなコード?

administrate/namespace.rb at master · thoughtbot/administrate · GitHub

module Administrate
  class Namespace
...
    def routes
      @routes ||= all_routes.select do |controller, _action|
        controller.starts_with?(namespace.to_s)
      end.map do |controller, action|
        [controller.gsub(/^#{namespace}\//, ""), action]
      end
    end

で、resourcesroutesをResourcesオブジェクトに仕立てたもの。

つまり?

routes.rbに書いてあって名前が"admin"ではじまるコントローラのくっついているroutesをナビゲーションバーに表示するよ!

routes.rbから消したらエラーになるんだけど?

普通はroutes.rbのnamespace admin以下のresourcesを消せばそれはナビゲーションバーから見えなくなる。 ただ、rootが設定されている場合はそれがadminではじまるコントローラ扱いになってroutesに残ってresources消したからshowかなんかが見えなくなってpathとれなくてエラー吐く。

rootもあわせて変更すること!