Reputation: 840
I have a question about how to do something "The Rails Way". With an application that has a public facing side and an admin interface what is the general consensus in the Rails community on how to do it?
Namespaces, subdomains or forego them altogether?
Upvotes: 30
Views: 24779
Reputation: 1725
Its surely late for a reply, but i really needed an answer to this question: how to easily do admin areas?
Here is what can be used these days: Active Admin, with Ryan Bates's great intro.
Upvotes: 0
Reputation: 840
Thanks to everyone that answered my question. Looks like the consensus is to use namespaces if you want to as there is no DHH sponsored Rails Way approach. :)
Again, thanks all!
Upvotes: 0
Reputation: 6418
There's no real "Rails way" for admin interfaces, actually - you can find every possible solution in a number of applications. DHH has implied that he prefers namespaces (with HTTP Basic authentication), but that has remained a simple implication and not one of the official Rails Opinions.
That said, I've found good success with that approach lately (namespacing + HTTP Basic). It looks like this:
routes.rb:
map.namespace :admin do |admin|
admin.resources :users
admin.resources :posts
end
admin/users_controller.rb:
class Admin::UsersController < ApplicationController
before_filter :admin_required
# ...
end
application.rb
class ApplicationController < ActionController::Base
# ...
protected
def admin_required
authenticate_or_request_with_http_basic do |user_name, password|
user_name == 'admin' && password == 's3cr3t'
end if RAILS_ENV == 'production' || params[:admin_http]
end
end
The conditional on authenticate_or_request_with_http_basic
triggers the HTTP Basic auth in production mode or when you append ?admin_http=true
to any URL, so you can test it in your functional tests and by manually updating the URL as you browse your development site.
Upvotes: 41
Reputation: 51
In some smaller applications I don't think you need to separate the admin interface. Just use the regular interface and add admin functionality for logged in users.
In bigger projects, I would go with a namespace. Using a subdomain doesn't feel right to me for some reason.
Upvotes: 5