名称间距控制器时命名空间还有什么?

时间:2014-09-13 13:06:26

标签: ruby-on-rails ruby-on-rails-4 namespaces subdomain

我打算针对不同的用户类型制作包含不同子域的应用。我将为每个用户类型命名控制器。现在我正在考虑我还需要命名空间以使其正常工作吗?

如果我命名控制器像这样:

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所以我该如何处理这个问题?

谢谢!

2 个答案:

答案 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方法,您可以检查其类并选择布局。 我强烈建议您重新考虑拆分用户类。不同的用户模型将导致重复的逻辑和复杂的认证。