【问题标题】:Rails file setup for a control panel?控制面板的Rails文件设置?
【发布时间】: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_usersdef 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


    【解决方案1】:

    没有控制面板控制器。为了保护非管理员的东西,请使用命名空间 - 在此处阅读更多信息:http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing

    您可以通过身份验证保护您的“管理员”命名空间控制器,并使非命名空间控制器向公众开放(或向非管理员用户开放)

    关于您的def public_usersdef control_panel_users 问题,您可能只有两个def index 方法——一个在非命名空间控制器中,一个在管理员命名空间控制器中。他们每个人都会做不同的事情。

    所以,你总共有 4 个控制器:

    2 个非命名空间,1 个用于用户,1 个用于照片(包含所有公共内容)
    2 个管理员命名空间,一个用于用户,一个用于照片(包含所有控制面板内容)

    如果您愿意,可以使用您喜欢的其他术语,而不是使用“admin”作为命名空间,例如“panel”。不过,“管理员”非常传统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 2020-07-06
      • 2012-03-25
      • 2015-09-13
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多