0

Rails 初学者在这里。

我正在尝试创建一个 Web 应用程序仪表板,显示 CPU、内存、磁盘使用情况等系统统计信息。

不会使用数据库,所以我想不需要模型。我将有视图和控制器。

我想到了一个 URL 模式:/dashboard/sys_stats/CPU/load、/dashboard/sys_stats/CPU/utilization、/dashboard/sys_stats/memory/free 等。

由于我对 Rails 的了解有限,我知道 controller#action 映射到 /controller/action 形式的 URI。我的问题是:

  1. 我的控制器和操作应该是什么?
  2. 由于控制器和动作只允许 URI 中的 2 级,即 /controller/action,我如何获得像我上面提到的那样的长 URI。
  3. 在某种程度上,CPU 和内存统计数据是我的模型。我只是不知道我是否应该具有从控制器中的操作系统读取 CPU/内存静态数据而不创建模型或创建模型类的逻辑。我认为模型是它所属的地方,但如果我错了,请纠正我。由于 Rails 模型与数据库相关联,我不知道如何在模型中包含从操作系统读取的逻辑。
4

2 回答 2

2

在不了解应用程序的全部范围的情况下,很难完全彻底地回答这些问题(此外还有多种方法可以解决其中一些问题),但我将根据您提供的信息以及我可能会如何进行回答做事。

1. 我的控制器和操作应该是什么?

Rails 控制器通常以单个资源命名,并包含管理单个资源的方法。资源可以是任何领域概念;通常,它们会与您的 Rails 模型进行一对一的映射,但并非必须如此。

在你的情况下,你可以去几个方向:

  1. 为每个统计“类型”(例如 CPU、内存等)设置一个控制器,并为每个“统计”(空闲、总计等)提供操作
  2. 有一个用于“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

(很明显,你会用一个真正有系统细节的类来替换这个类。)

于 2013-05-11T04:29:20.417 回答
1
  1. 仅从两个功能很难判断您的控制器应该是什么。对我来说,似乎一种好方法是为每种类型的统计信息( 、 等)设置一个控制器cpumemory并为每个特定的统计信息(utilization等)设置一个操作。你的路线是一个很大的暗示——正如你所指出的,URLS 通常是控制器/动作(你真的需要sys_stat在每个 URL 中吗?)——所以你可以从你一直在思考你的路线。

  2. 在 Rails 中,您可以创建自定义路由:

http://guides.rubyonrails.org/routing.html

这样,您可以将任何路由点指向任何控制器和操作。例如,要/dashboard/sys_stats/CPU/load指向控制器memory,动作free

match '/dashboard/sys_stats/memory/free' => 'memory#free'

当然,以这种方式列举每一个会​​很乏味(但会给你更多的控制权);您可以阅读路由文档以了解如何提高效率。

  1. Ruby 中的系统调用是通过以下方式进行的systemhttp ://ruby-doc.org/core-2.0/Kernel.html

模型不一定与数据库相关联——但一般规则是胖模型,瘦控制器。如果您发现自己在控制器中输入了大量逻辑,请将其分解为模型。如果它只是几行,那么就保留在那里。控制器应该只是将请求定向到模型和视图。

希望有帮助!

于 2013-05-11T04:03:47.133 回答