Rails_admin is very good, but often too much for what some people want. Developing your own admin section is quite easy.
How to create your own RESTful Admin section with Rails 3.2
Create your own Admin section with CRUD for all models, including nested resources using namespaces.
Example - Admin section for a Blog
- Models: Post, Comment (nested resource of Post)
I'm assuming you have the basic blog app developed. See http://guides.rubyonrails.org/getting_started.html for how to set all this up.
First step - Create admin section and controller
rails g controller admin/admin
This will generate an empty controller from which all our Admin controllers will inherit from. And it will also create views/admin/admin/index.html.erb which can act as out dashboard.
Create admin controllers
rails g controller admin/posts
rails g controller admin/comments
This will generate an empty Admin::PostsController and an Admin::CommentsController in admin namespace
Step 2 - Add namespace for admin controllers
Go to config/routes.rb and add the following
namespace :admin do
root to: "admin#index"
resources :posts do
resources :comments, :only => [:create, :destroy]
end
end
Step 3 - Edit admin views and controllers files to work with admin namespace
Now we have everything generated we just need to make it work with admin controller and not with front-end.
Change the inheritance of all Admin::*Controllers.
class Admin::PostsController < ApplicationController => class Admin::PostsController < Admin::AdminController
and
class Admin::CommentsController < ApplicationController => class Admin::CommentsController < Admin::AdminController
copy all templates from app/views/posts to app/views/admin/posts
copy all templates from app/views/comments to app/views/admin/comments
copy all functions from posts_controller.rb to admin/posts_controller.rb
copy all functions from comments_controller.rb to admin/comments_controller.rb
Add a link to views/admin/admin/index.html.erb for each of the models you would like to have Admin CRUD controld for. Eg post.
<%= link_to "Posts", admin_posts_path %>
Edit admin/posts_controller.rb. Change the 3 redirect_to calls to work with admin namespace.
Create and Update methods:
redirect_to @post => redirect_to [:admin, @post]
Destroy method:
redirect_to posts_url => redirect_to admin_posts_url
Make similar changes in all templates so that they work with within an admin namespace. You need to make following changes:
post/ _form.html.erb:
form_for(@post) => form_for([:admin, @post])
post/ edit.html.erb, index.html.erb, new.html.erb & show.html.erb find all instances of:
<%= link_to ‘Show’, @post %> => <%= link_to ‘Show’, [:admin, @post] %>
posts_path => admin_posts_path
edit_post_path(@post) => edit_admin_post_path(@post)
new_post_path => new_admin_post_path
<%= render "comments/form" %> => <%= render "admin/comments/form" %>
comment/ _comment.html.erb
<%= link_to 'Destroy Comment', [comment.post, comment],... => <%= link_to 'Destroy Comment', [:admin, comment.post, comment],...
comment/ _form.html.erb change:
<%= form_for([@post, @post.comments.build]) do |f| %>=> <%= form_for([:admin, @post, @post.comments.build]) do |f| %>
That’s all. Now you’ll have an /admin dashboard with a link to /admin/posts and CRUD actions available.
Shout-out to http://icebergist.com/posts/restful-admin-namespaced-controller-using-scaffolding. His solution from 2008 is still very relevant, however, there are obviously some differences to Rails 3.2 which this answer address; including nested resources.