セキュリティ系の勉強・その他開発メモとか雑談. 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を作ってやればうまく表示されると思います。