2013-05-11 32 views
0

Rails初學者在這裏。打破軌道風味的REST

我試圖創建Web應用程序儀表板顯示系統統計信息,如CPU,內存,磁盤等

沒有數據庫將被使用,所以我想車型將不再需要。我會有意見和控制器。

我心裏有一個URL模式:/儀表板/ sys_stats/CPU /負載/儀表板/ sys_stats/CPU /利用率/儀表板/ sys_stats /內存/免費等

用我有限的接觸Rails,我知道controller#action映射到form/controller/action的URI。我的問題是:

  1. 什麼應該是我的控制器和操作?
  2. 因爲控制器和動作允許在URI,即,/控制器/動作僅2的水平,如何獲得一個長的URI等我上面提到的那些。
  3. 某種程度上,CPU和內存統計是我的模型。我只是不知道是否應該有邏輯從控制器中的操作系統中讀取CPU /內存靜態信息,而不是創建模型或創建模型類。我認爲模特屬於它,但如果我錯了,請糾正我。由於Rails模型與數據庫相關聯,我不知道如何在模型中包含從OS讀取的邏輯。

回答

2

這是很難完全,徹底回答這些問題不知道該應用程序的完整程度(加上還有的去了解一些這些東西多種方式),但我會回答基於這些信息你給如何我可能會去做一些事情。

1.什麼應該是我的控制器和行動?

Rails控制器通常命名爲,並且包含管理單個資源的方法。資源是任何領域的概念;經常,他們與您的Rails模型一對一映射,但他們不需要。

在你的情況,你可以去幾個方向:

  1. 有各統計「類型」(例如CPU,內存等),爲每個「STAT」操作的控制器(免費,總等)
  2. 有一個控制器「sys_stats」,每種類型的行動

這一決定可能取決於如何您的應用程序的其餘部分的結構;如果sys_stats是應用程序而言,唯一的東西,也許它更有意義去前者。

2.由於控制器和動作只允許URI中的兩級,即/ 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 

(明顯你可以用一個實際得到系統細節的類來替換這個類。)

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' 

當然,列舉每一個這樣將是乏味的(但給你更多的控制);您可以閱讀路由文檔以瞭解如何使其更高效。在Ruby中

  1. 系統調用都是通過system做: http://ruby-doc.org/core-2.0/Kernel.html

模型不一定與數據庫相關 - 但總的原則是脂肪模型,瘦控制器。如果您發現自己在控制器中輸入了大量邏輯,則將其分解爲模型。如果只有幾行,那就把它保留下來。控制器應該只是將請求引導至模型和視圖。

希望有幫助!