如何设置视图,控制器和路径?
控制面板的所有功能都有一个控制器,或许多控制器?
首先,让我们试着思考如何查看各种面板。假设我们的控制面板非常简单。我们有一个面板显示所有已注册并可以CRUD的用户,另一个面板显示已上传的所有图像,我们也可以对这些用户进行CRUD。
路线:
scope path: 'control_panel' do
get 'users', to: 'panels#users', as: :panel_show_users
get 'photos', to: 'panels#photos', as: :panel_show_photos
end
控制器:
class PanelsController < ApplicationController
def users
@users = User.all
end
def photos
@photos = Photo.all
end
end
查看文件结构:
panels
|_ users.html.erb
|_ photos.html.erb
好的,现在我没有看到任何问题,只需访问面板并使用数据填充视图。 你看到有什么问题吗?
这是我在十字路口的地方。当我想创建更新并删除用户/照片时,我该怎么办?我应该把它们全部放在PanelsController中吗?
class PanelsController < ApplicationController
before_action :protect
def users
@users = User.all
end
def update_user
@user = User.find(params[:id])
@user.update(user_params)
end
def photos
@photos = Photo.all
end
def update_photo
@photo = Photo.find(params[:id])
@photo.update(photo_params)
end
private
def protect
redirect_to root_url, error: 'You lack privileges!'
end
end
虽然这会导致一个大的PanelsController,但是能够执行保护动作和一个控制器钩子会感觉很好。这也意味着路线很容易设置:
scope path: 'control_panel' do
get 'users', to: 'panels#users', as: :panel_show_users
post 'user', to: 'panels#update', as: :panel_create_user
get 'photos', to: 'panels#photos', as: :panel_show_photos
post 'photos', to: 'panels#photos', as: :panel_create_photo
end
我应该在这里使用资源路由吗?
就像我说的,这将导致一个巨大的面板控制器,所以我认为为每个资源设置一个单独的控制器,然后重定向到panels
个视图可能会更好?
路线:
scope path: 'control_panel' do
resources :users
resources :photos
end
控制器:
class UsersController < ApplicationController
def index
end
def show
end
def new
end
def create
end
def update
end
def destroy
end
end
class PhotosController < ApplicationController
def index
end
def show
end
def new
end
def create
end
def update
end
def destroy
end
end
但仍有一些怪癖。我在那里有我的Users #index动作,但如果我有两条路由返回所有用户的索引怎么办?例如,在控制面板中,当人们搜索另一个用户时。我应该在用户控制器中有两条路由吗? def public_users
和def control_panel_users
?这可能就是答案。可以设置一个钩子来在它们中运行@users = User.all
,但是重定向到另一个位置,而不是让protect
方法重定向它们。
我应该如何保护这些路由免受非管理员的攻击?我应该将我的保护方法移动到应用程序控制器中吗?设置不会有点繁琐吗?
class ApplicationController < ActionController
before_action :protect
def protect end
end
class StaticController < ApplicationController
skip_before_action [:home, :about, :contact]
def home
end
def about
end
def contact
end
end
但这是我的问题。 1个控制面板控制器或无控制面板控制器。
我真的希望有更多高级教程:(关于CRUD,MVC和其他东西的数十亿本书,但没有关于控制面板和AJAX等高级内容的内容......
答案 0 :(得分:0)
没有控制面板控制器。要保护非管理员的内容,请使用命名空间 - 请在此处详细了解:http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing
您可以使用身份验证保护“admin”命名空间控制器,并让非命名空间控制器向公众开放(或向非管理员用户开放)
关于您的def public_users
和def control_panel_users
问题,您可能只有两个def index
方法 - 一个位于非命名空间控制器中,一个位于admin-namespaced控制器中。他们每个人都会做不同的事情。
所以,你总共有4个控制器:
2个非命名空间,一个用于用户,一个用于照片(包含所有公共内容)
2个admin-namespaced,一个用于用户,一个用于照片(包含所有控制面板的东西)
如果你想要,而不是使用'admin'作为命名空间,你可以使用你喜欢的其他术语 - 比如'panel'。 “管理员”非常传统。