【问题标题】:what is a controller in sinatra?sinatra 中的控制器是什么?
【发布时间】:2016-01-25 12:18:26
【问题描述】:

有人问我为什么“我在自己的视图中创建复杂的 Ruby 变量。 我的控制器不应该声明这些变量吗?”

我的 sinatra 控制器 是我的 .rb 文件吗?我有一个 .rb 文件并查看视图。

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    您可以通过(在 1.9.2 中)在主 .rb 文件的顶部执行此操作来设置控制器的概念

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

    这将需要一个名为 controllers/ 的文件夹中的每个 .rb 文件的相对关系

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

    编辑:Rstat.us 已经改用 rails3,虽然仍然有帮助,但您可能需要返回 master 分支上的大量提交以了解它是如何使用的。

    【讨论】:

    • 这条评论值得更多的因果报应。非常有帮助。谢谢!
    【解决方案2】:

    在典型的 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};
    

    【讨论】:

    • 为什么我必须使用@data 而不是data
    • @Radek 因为实例变量由 Sinatra haml 助手提供给 Haml 模板,但局部变量不可用。
    【解决方案3】:

    开箱即用的 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

    【讨论】:

    【解决方案4】:

    @CaleyWoods:感谢您对 rstat.us 的引用

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

    (因此您不必浏览提交历史;-))

    【讨论】:

    【解决方案5】:

    如果你有继承自 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,但您也可以放入您的应用程序文件并确保调整目录结构。

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2011-08-15
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多