作为示例,可以说我正在创建一个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_update
和def_tweet_update
等等的每一个资源。不觉得很不错...
那么我应该如何配置我的路线?
我想我想创建一个可选的命名空间,我的两个嵌套的路线... 也许一个担心?如果我这样做,但是,我得到一个uninitialized constant Panel
错误。