【发布时间】:2014-06-16 21:13:25
【问题描述】:
如何设置视图、控制器和路由?
控制面板的所有功能一个控制器,还是多个控制器?
首先,让我们尝试考虑如何查看各种面板。假设我们的控制面板非常简单。我们有一个面板显示所有已注册并可以 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 等高级东西的书籍......
【问题讨论】:
标签: ruby-on-rails