【问题标题】:What else to namespace when name spacing controllers?命名间距控制器时还有什么命名空间?
【发布时间】:2014-11-07 12:46:56
【问题描述】:

我计划为不同的用户类型制作一个具有不同子域的应用。我将为我的每个用户类型命名空间控制器。现在我在想我还需要命名空间以使其正常工作吗?

如果我这样命名控制器:

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 那么我应该如何处理这个问题呢?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    最简单的方法是使用生成器

    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] = 'student'

    layout :set_layout
    
    def set_layout
      session[:layout] || 'application'
    end
    

    或者如果你有一个获取用户的 current_user 方法,你可以检查它的类并选择布局。 我强烈建议您重新考虑拆分用户类。不同的用户模型会导致重复的逻辑和复杂的认证。

    【讨论】:

    • 谢谢,+1 :)。你能告诉我在这种情况下如何处理布局吗?我的视图文件夹中有一个布局文件夹,其中有应用程序视图,其中我根据登录的用户显示布局。我还应该在“学生”命名空间文件夹中创建布局文件夹吗?谢谢!
    【解决方案2】:

    如果没有看到您的其余代码,很难确切地知道您要实现的目标,但是在 Rails 的子域中,有一个很棒的 Railscasts episode,它可能会对您有所帮助。

    为代码命名空间并不是让代码正常运行的必要条件,但它可以帮助您保持代码井井有条。以下是使用子域时需要考虑的一些额外事项:

    路线

    ...
     match '/' => 'users#show', :contraints => { :subdomain => /.+/ }
    ...
    

    此示例使用约束将所有子域路由到 users#show 操作。您可以使用这种技术来区分子域,将它们路由到适当的控制器操作。

    控制器

    一旦您设置了路由文件以正确路由子域,您就可以通过请求在任何控制器中检索子域:

    def show
      @subdomain = request.subdomain
    end
    

    这将允许您向应用程序添加特定于子域​​的逻辑。

    查看

    链接到其他子域的视图很简单,只需将子域选项传递给您的 url 方法:

     root_url(subdomain: 'student')
    

    【讨论】:

    • 谢谢,但我试图避免在我的视图和控制器中出现大量“if”语句的情况。我的用户在寻找“家庭作业”的“显示”视图时有很多不同的视图。我将有 4 种类型的用户,我不想要凌乱的代码。这就是为什么它不会是 DRY 的原因,但最大的优势是代码更简洁,更容易维护。我只是不确定如何处理我的问题中的这些疑问。
    猜你喜欢
    • 2014-05-19
    • 2012-07-08
    • 1970-01-01
    • 2015-07-05
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多