【问题标题】:Breaking the Rails-flavored REST打破 Rails 风格的 REST
【发布时间】:2013-05-05 19:19:34
【问题描述】:

这里是 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 模型与数据库相关联,我不知道如何在模型中包含从操作系统读取的逻辑。

【问题讨论】:

    标签: ruby-on-rails rest model-view-controller


    【解决方案1】:
    1. 仅通过两个功能很难判断您的控制器应该是什么。对我来说,似乎一种好方法是为每种类型的统计数据(cpumemory 等)设置一个控制器,并为每个特定的统计数据设置一个操作(utilization 等)。你的路线是一个很大的暗示——正如你所指出的,URLS 通常是控制器/动作(你真的需要在每个 URL 中使用sys_stat 吗?)——所以你可以从你的经历中获得很多信息考虑你的路线。

    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 中的系统调用是通过system 进行的: http://ruby-doc.org/core-2.0/Kernel.html

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

    希望有帮助!

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      (显然你会用实际获取系统详细信息的类替换这个类。)

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 1970-01-01
        • 2014-02-15
        • 2019-11-30
        • 2012-11-09
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        相关资源
        最近更新 更多