我打算针对不同的用户类型制作包含不同子域的应用。我将为每个用户类型命名控制器。现在我正在考虑我还需要命名空间以使其正常工作吗?
如果我命名控制器像这样:
app/controllers/student/users_controller.erb
app/controllers/student/...
app/controllers/student/...
然后我想我还需要像这样命名视图:
app/views/student/homeworks/index.html.erb
app/views/student/homeworks/...
app/views/student/homeworks/...
我是否还需要命名空间帮助程序和我处理用户登录的SessionController?另外,我不认为我应该命名空间ApplicationController
所以我该如何处理这个问题?
谢谢!
答案 0 :(得分:1)
如果没有看到代码的其余部分,很难确切地知道您要实现的目标,但Rails中的子域上有一个很棒的Railscasts episode可能对您有帮助。
命名空间代码对于让代码正常运行并不重要,尽管它可以帮助您保持代码的有序性。在使用子域时,下面是一些需要考虑的事项:
<强>路线强>
...
match '/' => 'users#show', :contraints => { :subdomain => /.+/ }
...
此示例使用约束将所有子域路由到users#show
操作。您可以使用此技术来区分子域,并将它们路由到适当的控制器操作。
<强>控制器强>
设置路由文件以正确路由子域后,您可以通过请求检索任何控制器中的子域:
def show
@subdomain = request.subdomain
end
这将允许您向应用程序添加特定于子域的逻辑。
查看强>
直接向其他子域链接视图,只需将子域选项传递给您的url方法:
root_url(subdomain: 'student')
答案 1 :(得分:1)
最简单的方法是使用genarators
rails g controller 'student/users' new create etc.
或
rails g controller student::users
如果要添加其他控制器:
rails g controller student::classes
这会自动为控制器和视图创建必要的结构。
然后添加您的路线:
namespace :student do
resources :users
resources :classes
end
您可以使用new_student_user_path
使用非命名空间控制器,您通常会键入form_for @user来创建具有命名空间的用户:
<%= form_for [:student, @user] do |f| %>
...
如果用户之间的差异只是他们的能力,那么使用像cancan或declarative_authorization这样的gem来管理授权会更好。 如果为每种类型存储不同的信息,则可以创建具有与不同配置文件的多态关系的单个用户模型。 更多信息:
How to model different users in Rails
Rails App with 3 different types of Users
......................................
修改
您可以从application_controller设置布局。我想在登录时你可以将布局存储在cookie或会话哈希中:session [:layout] =&#39; student&#39;
layout :set_layout
def set_layout
session[:layout] || 'application'
end
或者,如果您有一个获取用户的current_user方法,您可以检查其类并选择布局。 我强烈建议您重新考虑拆分用户类。不同的用户模型将导致重复的逻辑和复杂的认证。