Rails方式 - 命名空间

Car*_*os 30 namespaces ruby-on-rails

我有一个关于如何做一些事情的问题"The Rails Way".如果应用程序具有面向公众的一面和管理界面,那么Rails社区对如何做到这一点的普遍共识是什么?

命名空间,子域还是完全放弃它们?

Ben*_*eld 40

管理界面没有真正的"Rails方式",实际上 - 您可以在许多应用程序中找到所有可能的解决方案.DHH暗示他更喜欢名称空间(使用HTTP基本身份验证),但这仍然是一个简单的含义,而不是官方的Rails意见之一.

也就是说,我最近用这种方法取得了很好的成功(命名空间+ HTTP Basic).它看起来像这样:

routes.rb中:

map.namespace :admin do |admin|
  admin.resources :users
  admin.resources :posts
end
Run Code Online (Sandbox Code Playgroud)

管理员/ users_controller.rb:

class Admin::UsersController < ApplicationController
  before_filter :admin_required
  # ...
end
Run Code Online (Sandbox Code Playgroud)

application.rb中

class ApplicationController < ActionController::Base
  # ...

  protected
  def admin_required
    authenticate_or_request_with_http_basic do |user_name, password|
      user_name == 'admin' && password == 's3cr3t'
    end if RAILS_ENV == 'production' || params[:admin_http]
  end
end
Run Code Online (Sandbox Code Playgroud)

条件on authenticate_or_request_with_http_basic在生产模式下或在您附加?admin_http=true到任何URL 时触发HTTP Basic身份验证,因此您可以在功能测试中测试它,并在浏览开发站点时手动更新URL.

  • 我讨厌这个.这些路线的名称很尴尬:"new_admin_user_path".这是管理员创建新用户的操作,而不是创建新的管理员用户.它应该被称为"admin_new_user_path".丑陋.这让我怀疑我使用命名空间来做错事. (2认同)

小智 5

在一些较小的应用程序中,我认为您不需要分离管理界面.只需使用常规界面并为登录用户添加管理功能.

在更大的项目中,我会使用命名空间.由于某种原因,使用子域对我来说不合适.