在不了解应用程序的全部范围的情况下,很难完全、完全地回答这些问题(此外还有多种方法可以解决其中一些问题),但我将根据您提供的信息以及我如何回答可能会去做事。
1。我的控制器和操作应该是什么?
Rails 控制器通常以单个资源命名,并包含管理单个资源的方法。资源可以是任何领域概念;通常,它们会与您的 Rails 模型一对一地映射,但并非必须如此。
在你的情况下,你可以走几个方向:
- 为每个统计“类型”(例如 CPU、内存等)设置一个控制器,并为每个“统计”(空闲、总计等)提供操作
- 为“sys_stats”提供一个控制器,其中包含针对每种类型的操作
此决定可能取决于您应用的其余部分的结构;如果sys_stats 是应用程序唯一关心的事情,那么选择前者可能更有意义。
2。由于控制器和操作只允许 URI 中的 2 级,即 /controller/action,我如何获得像我上面提到的那样长的 URI。
您可以通过 Rails 路由系统很好地控制 URL 生成。您可以在 Rails Routing from the Outside In guide 上找到大量具体细节,但如果您使用控制器/动作布局 #1(如上所述),它可能看起来像这样:
get "dashboard/sys_stats/:controller/:action"
3。在某种程度上,CPU 和内存统计数据是我的模型。
是的,以这种方式构建应用程序将使测试更容易,并且很可能更容易工作和维护。重要的是要记住,您可以拥有一个模型(即使在 app/models 中),而无需以任何方式扩展 ActiveRecord::Base。有了正确的抽象,您的控制器甚至不需要知道您的模型没有绑定到数据库。
我已经创建了一个演示这些概念的小演示应用程序;你可以在 GitHub 上找到它https://github.com/BinaryMuse/so16493562-rails-stats-example。
一些相关文件:
config/routes.rb
RailsSystemStats::Application.routes.draw do
get "dashboard/sys_stats/:controller/:action"
end
app/controllers/memory_controller.rb
class MemoryController < ApplicationController
before_filter do
@memory = MemoryStat.new
end
def free
respond_to do |format|
format.html
format.json do
render json: { memory: { free: @memory.free } }
end
end
end
def total
respond_to do |format|
format.html
format.json do
render json: { memory: { total: @memory.total } }
end
end
end
end
app/models/memory_stat.rb
class MemoryStat
def initialize
end
def free
6.5.gigabytes
end
def total
8.gigabytes
end
end
(显然你会用实际获取系统详细信息的类替换这个类。)