在不了解应用程序的全部范围的情况下,很难完全彻底地回答这些问题(此外还有多种方法可以解决其中一些问题),但我将根据您提供的信息以及我可能会如何进行回答做事。
1. 我的控制器和操作应该是什么?
Rails 控制器通常以单个资源命名,并包含管理单个资源的方法。资源可以是任何领域概念;通常,它们会与您的 Rails 模型进行一对一的映射,但并非必须如此。
在你的情况下,你可以去几个方向:
- 为每个统计“类型”(例如 CPU、内存等)设置一个控制器,并为每个“统计”(空闲、总计等)提供操作
- 有一个用于“sys_stats”的控制器,其中包含每种类型的操作
这个决定可能取决于你的应用程序的其余部分是如何构建的;如果sys_stats
是应用程序唯一关心的事情,那么选择前者可能更有意义。
2. 由于controller 和action 只允许URI 中的2 级,即/controller/action,我如何获得像我上面提到的那样长的URI。
您可以通过 Rails 路由系统很好地控制 URL 生成。您可以在Rails Routing from the Outside In 指南中找到大量具体细节,但如果您使用控制器/动作布局 #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
(很明显,你会用一个真正有系统细节的类来替换这个类。)