什么是sinatra的控制器?

时间:2011-05-03 23:46:32

标签: ruby sinatra

我被问到为什么“我在视图中创建了复杂的Ruby变量。 不应该由我的控制器声明这些变量吗?“

我的 sinatra控制器我的 .rb 文件?我有一个.rb文件和视图视图。

5 个答案:

答案 0 :(得分:17)

您可以通过在主.rb文件的顶部执行(在1.9.2中)设置控制器的想法

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

这将require_relative名为controllers /

的文件夹中的每个.rb文件

从那里你可以像以前在主.rb文件中那样实现正常路由。请查看Github上的rstat.us

编辑:Rstat.us已经使用了rails3,虽然仍然有用,但您可能需要返回主分支上的多次提交以查找它的使用方式。

答案 1 :(得分: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

答案 2 :(得分:6)

在典型的MVC设置中,每个Sinatra路由都可以被视为自己的控制器。以你的例子:

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};

答案 3 :(得分:1)

@CaleyWoods:感谢您参考rstat.us

对于那些正在寻找Sinatra版本的人来说,这里是Sinatra提交的链接: https://github.com/hotsh/rstat.us/tree/00b27505681d80b3943fd9b9e9791f664a04cf39

(所以你不必浏览提交历史;-))

答案 4 :(得分: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,但您也可以放入您的应用程序文件,并确保调整目录结构。