2011-05-03 38 views
10

有人問我爲什麼「我在我的視圖中創建複雜的Ruby變量。 不應該由我的控制器聲明這些變量嗎?」sinatra中的控制器是什麼?

是我西納特拉控制器.RB文件?我有一個.rb文件和視圖視圖。

回答

6

每個Sinatra的路線可以被認爲是典型的MVC開發它自己的控制器etup。對於你的例子:

require 'sinatra' 
require 'json' 
get "/foo" do 
    # This might take many lines of excellent code to form your data 
    @data = some_complex_array_hash_combo 
    haml :foo 
end 

然後在foo.haml

:javascript 
    var data = #{@data.to_json}; 
+0

爲什麼我必須使用'@ data'而不是'data'? – Radek 2011-05-04 01:25:14

+2

@Radek由於實例變量由Sinatra'haml' helper提供給Haml模板,但本地變量不可用。 – Phrogz 2011-05-04 01:39:30

6

開箱即用的Sinatra沒有標準的MVC框架。因此,雖然您不希望將所有內容都保留在主視圖文件中,但您在技術上也沒有「控制器」來放置它。將應用程序拆分爲不同的功能可能是最簡單的方法。將大部分功能劃分爲獨立的類和小型事物,並將其分配到助手庫中。在別人是怎麼做這可能幫助了

來看,這個職位應該有一些不錯的例子,你學習:https://stackoverflow.com/questions/2075758/real-life-examples-of-sinatra-applications

如果一個MVC框架變成東西,你真的認爲你需要,看看Padrino(http://padrinorb.com

略相關帖子:

https://softwareengineering.stackexchange.com/questions/14293/ruby-sinatra-best-practices-for-project-structure

+0

什麼是助手庫? – Radek 2011-05-03 23:58:39

+0

助手是旨在幫助意見的課程。 http://ididitmyway.heroku.com/past/2010/4/25/sinatra_helpers/ – Tyler 2011-05-04 00:13:55

17

您可以通過(在1.9.2),這在你的主要的.rb文件的頂部設置控制器的想法

Dir.glob("controllers/*.rb").each { |r| require_relative r } 

這將require_relative每個.RB文件中的一個文件夾中稱爲控制器/

從那裏你可以實現正常的路由,就像你以前在主.rb文件中做的那樣。請在Github上查看rstat.us

編輯:Rstat.us已經走了rails3,雖然仍然有幫助,但您可能需要回去主分支上的許多提交以查找它是如何使用的。

+0

這個評論值得更多的業力。很有幫助。謝謝! – 2011-09-07 04:58:45

+0

@ j33r謝謝!非常感激。 – 2011-09-08 14:54:37

1

@CaleyWoods:感謝你的提及rstat.us

對於那些誰正在尋找西納特拉的版本,這裏是一個西納特拉的鏈接提交: https://github.com/hotsh/rstat.us/tree/00b27505681d80b3943fd9b9e9791f664a04cf39

(所以你不」不必拖過提交歷史記錄;-))

+0

和https://github.com/hotsh/rstat.us/blob/00b27505681d80b3943fd9b9e9791f664a04cf39/rstatus.rb#L79 L#79顯示允許您使用控制器/文件夾的Dir.glob語句。 – 2012-09-18 15:05:22

0

如果您有從ApplicationController繼承的控制器,這僅用於繼承。祝你好運! 如果您的應用程序使用config.ru文件,那麼這可能會有所幫助。

require 'active_support' 
require 'sinatra/base' 

APP_ROOT = Pathname.new(File.expand_path('../', __FILE__)) 

# We have to do this in case we have controllers that inherit from each other. 
Dir[APP_ROOT.join('app', 'controllers', '*.rb')].each do |controller_file| 
    filename = File.basename(controller_file).gsub('.rb', '') 
    autoload ActiveSupport::Inflector.camelize(filename), controller_file 
end 

這個假設你把那個代碼放到你的config.ru中,但是你也可以把你的應用程序文件也放進去,並且一定要調整目錄結構。