命名空间管理区域

时间:2014-04-29 17:26:43

标签: ruby-on-rails

举个例子,假设我正在创建一个推特(-ish)克隆。


  • 用户has_many推文
  • 推文属于用户

  • 用户可以创建推文
  • 用户可以编辑和删除自己的推文
  • 管理员用户可以编辑和删除所有推文
  • 管理员用户可以编辑和删除非管理员用户

这是我的推文控制器:

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,因为通过面板(复数)我指的是管理区域中的多个面板,用户面板(用于显示所有用户并在视图中提供管理控件)和推文面板:

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远离用户和推文,但我应该如何命名我的Panels控制器?

当管理员在面板控制器的用户视图中查看用户时,我希望网址如下所示:

/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错误。

1 个答案:

答案 0 :(得分: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中保留网站用户的关注,并在app / controllers / control_panel / tweets_controller.rb中的ControlPanel::TweetsController中控制面板问题

您可以阅读有关命名空间和路由here的更多信息。