2011-05-03 65 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中,但是你也可以把你的应用程序文件也放进去,并且一定要调整目录结构。