我被问到为什么“我在视图中创建了复杂的Ruby变量。 不应该由我的控制器声明这些变量吗?“
我的 sinatra控制器我的 .rb 文件?我有一个.rb文件和视图视图。
答案 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)
看看其他人如何做到这一点可能有所帮助,这篇文章应该有一些很好的例子供你学习:https://stackoverflow.com/questions/2075758/real-life-examples-of-sinatra-applications
如果MVC框架成为您认为需要的东西,请查看Padrino(http://padrinorb.com)
略有相关的帖子:
答案 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,但您也可以放入您的应用程序文件,并确保调整目录结构。