举个例子,假设我正在创建一个推特(-ish)克隆。
这是我的推文控制器:
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_update
和def_tweet_update
添加大量操作以外,还不知道我还能做些什么。感觉不太好......
那我应该如何配置我的路线呢?
我想我想在我的两个嵌套路线周围创建一个可选的命名空间...
也许是一个担忧?但是,如果我这样做,我会收到uninitialized constant Panel
错误。
答案 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
这可以获取您想要的所有路线,并且它们都指向UsersController
和TweetsController
我推荐的是为管理员使用不同的控制器。您可以使用名称空间来实现此目的。
namespace :control_panel do
resources :users, etc: ...
end
然后,在TweetsController
中保留网站用户的关注,并在app / controllers / control_panel / tweets_controller.rb中的ControlPanel::TweetsController
中控制面板问题
您可以阅读有关命名空间和路由here的更多信息。