セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

【Rails】Administrateでモデルを持たないページ(Rootページ)を作成

Administrate

管理画面を簡単に作れるgemで、カスタマイズが他のものよりも容易である点が特徴っぽいです。 f:id:thinline196:20190827112627p:plain github.com



今回使用したバージョン

# Gemfile.lock
    administrate (0.11.0)
    administrate-field-nested_has_many (1.1.0)

トップページ

ルーティングはこのような感じで行います。root toで指定したページが/admin以下のルートページとして使用されるようです。

Rails.application.routes.draw do
  namespace :admin do
      resources :users
      resources :hoges
      root to: "root#index"
    end
end



gemの特性

名前空間admin内に指定したものが自動的にadministrateの管轄下に置かれる?そうで、自動的にindexページやナビゲーションバー(他ページへのリンク)などが生成されます。便利。

しかし、このせいでモデルが準備されていないただのページを作ることができません。例えば上のルーティングはRootController#indexをたどると思うのですが、Rootなんてモデルは存在しない(作らないし)ので、エラーになります。

解消法

このエラーは、ナビゲーションバーを生成する際に起きているっぽいので、指定したモデルのみサイドバーに表示させるようにすることで回避します。
- まず、administrateのlayoutファイルを書き出します。

$ bin/rails generate administrate:views:layout

これで生成されたうちのapp/views/admin/application/_navigation.html.erbを編集します。(今回slimに書き換えてます。) - eachで回している部分を表示したいモデル名のみに書き換えます。今回はベタ書きしていますが、Globalなんかで別ファイルに定義するといいと思います。下のようにします。

nav.navigation role="navigation"
  - ['users','hoges'].each do |resource|
    = link_to(   ....             


こうすることで、Rootなんて存在しないモデルを探索しなくなるのでエラーが出なくなりました。後は、administrateの指定通りにControllerviewを作ってやればうまく表示されると思います。