控制面板的Rails文件设置?

时间:2014-06-16 12:45:03

标签: ruby-on-rails

如何设置视图,控制器和路径?

控制面板的所有功能都有一个控制器,或许多控制器?

首先,让我们试着思考如何查看各种面板。假设我们的控制面板非常简单。我们有一个面板显示所有已注册并可以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等高级内容的内容......

1 个答案:

答案 0 :(得分:0)

没有控制面板控制器。要保护非管理员的内容,请使用命名空间 - 请在此处详细了解:http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing

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

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

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

2个非命名空间,一个用于用户,一个用于照片(包含所有公共内容)
2个admin-namespaced,一个用于用户,一个用于照片(包含所有控制面板的东西)

如果你想要,而不是使用'admin'作为命名空间,你可以使用你喜欢的其他术语 - 比如'panel'。 “管理员”非常传统。