Namespace in Rails
Namespace là một trong những tính năng của rails cho phép chúng ta tổ chức và phân biệt rõ ràng trong cấu trúc và phần xử lý của ứng dụng. Giả như trong một ứng dụng có phân quyền, có những chức năng mà bất cứ người dùng nào cũng có thể sử dụng, nhưng có những chức năng chỉ có những người quản ...
Namespace là một trong những tính năng của rails cho phép chúng ta tổ chức và phân biệt rõ ràng trong cấu trúc và phần xử lý của ứng dụng. Giả như trong một ứng dụng có phân quyền, có những chức năng mà bất cứ người dùng nào cũng có thể sử dụng, nhưng có những chức năng chỉ có những người quản lý(admin) mới có quyền thực hiện.
resources :books, only: [:index, :show]
namespace :admin do resources :book, except: [:index, :show] end
Như trong ví dụ trên, chúng ta cho phép tất cả người dùng xem danh sách và xem cụ thể một book, nhưng chỉ có admin mới có quyền add/edit/delete một đối tượng book.
Đoạn code thứ 1 sẽ thiết lập các route có dạng/books/
Đoạn code thứ 2 sẽ thiết lập các route có dạng /admin/books
Điều này dẫn tới việc sẽ tồn tại các view và controller độc lập với các view và controller sẵn có. Các view và controller riêng này sẽ nằm trong thư mục app/controller/namespace(ở đây là admin) và app/view/namespace(admin) thay vì app/controller và app/view như bình thường. Chúng ta có thể sử dụng namespace để khai báo nhiều resources với các chức năng dành riêng cho admin.Ví dụ:
namespace :admin do resources :books, except: [:index, :show] resources :categories, except: [:index, :show] end
Tất cả các controller trong thư mục riêng namespace sẽ được định nghĩa dưới dạng
class Namespace::ObjectController < Application Controller //method end
Chú ý là để sử dụng các view ở bên trong app/view/namespace folder chúng ta cần phải thiết lập:
class Namespace::ObjectController < Application Controller layout "admin/application" //method end
Chúng ta có thể định nghĩa một lớp BaseController với thiết lập như trên và kế thừa từ ApplicationController. Sau đó các Controller trong namespace sẽ kế thừa từ BaseController; điều này giúp giảm việc phải khai báo quá nhiều lần
class Admin::BaseController < ApplicationController layout "admin/application" end class Admin::ObjectController < Admin::BaseController //method end
Như trong ví dụ trên việc sử dụng namespace admin sẽ giúp chúng ta phân quyền, view và controller cho các mục đích sử dụng của các đối tượng cụ thể sẽ là độc lập với nhau
Mình xin tạm dừng tại đây.Bài viết còn nhiều thiếu sót rất mong nhận được sự góp ý của bạn đọc