看到 Guide 里面有好几种
namespace :admin do
resources :posts, :comments
end
scope '/admin' do
resources :posts, :comments
end
各自对应不同的 controller 写法
不知道哪种比较简单,便捷?一般是如何实现的?
namespace :admin do
resources :posts, :comments
end
# 对应controller在controller/admin/xxx_controller.rb
scope '/admin' do
resources :posts, :comments
end
# 对应controller在controller/xxx_controller.rb
就是多了一个 admin 空间,看你自己的需求了。 我一般配合 cancancan,就用第二种。
下面是我个人的实现方法。
routes.rb
namespace :admin do
root 'application#dashboard'
resources :posts, :replies
end
在 app/controllers/admin
下定义一个父类
app/controllers/admin/application_controller.rb
class Admin::ApplicationController < ApplicationController
layout 'admin'
before_filter :require_sign_in
def dashboard
end
private
def require_sign_in
redirect_to sign_in_path unless user_signed_in?
end
end
然后 Admin 的 controller 都放在 app/controllers/admin
下,并继承这个类
app/controllers/admin/posts_controller.rb
class Admin::PostsController < Admin::ApplicationController
end
我把不同职责的 route 放到不同的文件中了,然后在 config/application.rb
config.paths.config.routes.concat Dir[Rails.root.join("config/routes/*.rb")]
Rails best practice 中有一个比较好的范例
# config/routes.rb
ActionController::Routing::Routes.draw do |map|
map.resources :posts
map.resources :comments
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
map.login '/login', :controller => 'sessions', :action => 'create'
map.namespace :developer do |dev|
dev.resources :posts
dev.resources :comments
dev.logout '/logout', :controller => 'sessions', :action => 'destroy'
dev.login '/login', :controller => 'sessions', :action => 'create'
end
map.namespace :admin do |admin|
admin.resources :posts
admin.resources :comments
admin.logout '/logout', :controller => 'sessions', :action => 'destroy'
admin.login '/login', :controller => 'sessions', :action => 'create'
end
map.namespace :api do |api|
api.resources :posts
api.resources :comments
api.logout '/logout', :controller => 'sessions', :action => 'destroy'
api.login '/login', :controller => 'sessions', :action => 'create'
end
end
The better solution is to split the routes into different files according namespaces.
# config/routes.rb
ActionController::Routing::Routes.draw do |map|
map.resources :posts
map.resources :comments
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
map.login '/login', :controller => 'sessions', :action => 'create'
end
# config/routes/developer.rb
ActionController::Routing::Routes.draw do |map|
map.namespace :developer do |dev|
dev.resources :posts
dev.resources :comments
dev.logout '/logout', :controller => 'sessions', :action => 'destroy'
dev.login '/login', :controller => 'sessions', :action => 'create'
end
end
# config/routes/admin.rb
ActionController::Routing::Routes.draw do |map|
map.namespace :admin do |admin|
admin.resources :posts
admin.resources :comments
admin.logout '/logout', :controller => 'sessions', :action => 'destroy'
admin.login '/login', :controller => 'sessions', :action => 'create'
end
end
# config/routes/api.rb
ActionController::Routing::Routes.draw do |map|
map.namespace :api do |api|
api.resources :posts
api.resources :comments
api.logout '/logout', :controller => 'sessions', :action => 'destroy'
api.login '/login', :controller => 'sessions', :action => 'create'
end
end
In Rails3, you can set the configs in config/application.rb
config.paths.config.routes.concat Dir[Rails.root.join("config/routes/*.rb")]
参考资料:
http://rails-bestpractices.com/posts/73-split-route-namespaces-into-different-files