2014-04-29 40 views
0

作为示例,可以说我正在创建一个Twitter( - )克隆。命名空间管理区域


  • A用户的has_many鸣叫
  • 鸣叫属于用户

  • 用户可以创建鸣叫
  • 用户可以编辑和删除自己的微博
  • 管理员的用户c编辑并删除所有微博
  • 用户谁是管理员可以编辑和删除谁不是管理员

用户这是我的鸣叫控制器:

class TweetsController < ActionController 
    before_action :set_tweet, only: [:edit, :update, :destroy] 
    before_action :only_admins_and_owner, only: [:edit, :update, :destroy] 


    def edit 
     # edits the tweet 
    end 

    def update 
     # updates the tweet 
    end 

    def destroy 
     # destroys the tweet 
    end 

    private 
     ### security 
     def only_admins_and_owner 
      redirect_to root_url unless current_user.is_admin? || current_user === @tweet.user 
     end 
     ### 

     def set_tweet 
      @tweet = Tweet.find(params[:id]) 
     end 
end 

我的用户控制器:

class UsersController < ActionController 
    before_action :set_user, only: [:edit, :update, :destroy] 
    before_action :only_admins_and_user, only: [:edit, :update, :destroy] 


    def edit 
     # edits the user 
    end 

    def update 
     # updates the user 
    end 

    def destroy 
     # destroys the user 
    end 

    private 
     ### security 
     def only_admins_and_user 
      redirect_to root_url unless current_user.is_admin? || current_user === @user 
     end 
     ### 

     def set_user 
      @user = User.find(params[:id]) 
     end 
end 

这里是我的面板控制器。不知道这是否是正确的做法。你怎么看待我的命名规则?我还没有将它称为AdminController,因为通过面板(复数)我指的是管理区域中的多个面板,用户面板(用于在视图中显示所有用户和提供管理控件)和tweets面板:

class PanelsController < ActionController 
    before_action :only_admins 
    def users 
     @users = User.all 
    end 

    def tweets 
     @tweets = Tweet.all 
    end 

    private 
     ### security 
     def only_admins 
      redirect_to root_url unless current_user.is_admin? 
     end 
     ### 
end 

如果您认为此控制器设置没问题,应如何配置我的路线以使用这些操作?

我的路线文件:

MyApp::Application.routes.draw do 
    resources :users, except: [:index] do 
     resources :tweets, except: [:index] 
    end 
end 

现在,如果我是一个普通用户,在用户和微博CRUDing离开,但我应该如何命名空间我的面板控制器上面的工作好吗?

当管理员在查看用户在面板控制器的用户观看,我想的URL看起来像这样:

/control_panel/users 
/control_panel/tweets 

,并在管理方面进行编辑时:

/control_panel/users/12/edit 
/control_panel/users/12/tweets/142/edit 

但是当用户正在编辑自己的用户或鸣叫:

/users/12/edit 
/users/12/tweets/142/edit 

这是因为panels管理视图与用户视图大不相同,但编辑,更新和删除的功能完全相同,因此我想使用已有的操作。我做对了吗?不知道我还能做什么,除了将大量操作添加到面板控制器def_user_updatedef_tweet_update等等的每一个资源。不觉得很不错...

那么我应该如何配置我的路线?

我想我想创建一个可选的命名空间,我的两个嵌套的路线... 也许一个担心?如果我这样做,但是,我得到一个uninitialized constant Panel错误。

回答

0

如果你想使用相同的控制器,这是我不真的推荐,你可以使用一个范围。

resources :users, except: [:index] do 
    resources :tweets, except: [:index] 
end 
scope :control_panel do 
    resources :users, expect: [:index] do 
    resources :tweets, except: [:index] 
    end 
end 

这让你所有你想要的路线,他们都指向UsersControllerTweetsController

我建议取而代之的是使用管理员不同的控制器。您可以使用名称空间来实现这一点。

namespace :control_panel do 
    resources :users, etc: ... 
end 

然后你让网站用户在TweetsController关注和控制面板关切ControlPanel::TweetsController在app /控制器/ CONTROL_PANEL/tweets_controller.rb

你可以阅读更多关于命名空间和路由here