2014-06-16 95 views
0

你如何設置你的觀點,控制器和路線?控制面板的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 

不過雖然有些怪癖。我在那裏有我的用戶#索引操作,但是如果我有兩條返回所有用戶索引的路線呢?例如,在控制面板中,當人們正在搜索另一個用戶時。我應該在用戶控制器中有兩條路線嗎? 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先進的東西書籍十億...

回答

0

不要有控制面板控制器,並保護非管理員的東西,使用命名空間 - 在這裏閱讀更多關於它:http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing

您可以保護您的'管理員'名稱空間控制器身份驗證,並有非名稱空間控制器向公衆開放或對非管理員用戶開放)

關於您的def public_usersdef control_panel_users問題,您可能只有兩個def index方法 - 一個在非名稱空間控制器中,另一個在admin-namespaced控制器中。他們每個人都會做不同的事情。

所以,你有4個控制器總數:

2個非命名空間,一個用於用戶,一個用於照片(包含所有公共的東西)
2管理員命名空間中的,一個是用戶,一個用於照片(包含所有控制面板的東西)

如果你想要,而不是使用'管理'作爲命名空間,你可以使用其他一些你喜歡的術語 - 比如'panel'。 '管理'是非常傳統的,但。