【问题标题】:Set views folder for ApplicationController in Sinatra without overriding在 Sinatra 中为 ApplicationController 设置视图文件夹而不覆盖
【发布时间】:2018-10-11 17:51:49
【问题描述】:

我的 Sinatra 应用程序中有三个控制器:基本的 ApplicationController,以及一个 AuthorsController 和 BooksController,它们都继承自 ApplicationController。

我的视图文件结构是:

|-views
|   |
|  books/
|   |
|  authors/
|   |
|  home.erb

我在 BooksController 的顶部设置了带有 set :views, "app/views/books" 的 Books 的 views 文件夹,而 Authors 类似;两者都有效。

ApplicationController 只定义了一个路由:

class ApplicationController < Sinatra::Base

    set :views, "app/views"

    get "/" do
        erb :home
    end

end

当我转到“/”时,它会在 Books 文件夹或 Authors Controller 中查找主视图,具体取决于我的 config.ru 文件中的第一个:

require_relative './config/environment'

use BooksController
use AuthorsController
run ApplicationController

注释掉其他控制器(或只是其中的set :views 行)使“/”路由按预期工作。我的代码肯定是在正确的控制器上使用正确的方法;它只是在错误的地方寻找风景。

【问题讨论】:

  • 你为什么从ApplicationController而不是Sinatra::Base派生其他控制器?您要向所有控制器添加什么?
  • @Sara 不多:基本上只是一个method_override: true。我曾认为为整个应用程序设置一个父控制器是有意义的,但现在我发现我错了。

标签: ruby sinatra


【解决方案1】:

在 Sinatra 中,路由按照它们在代码中定义的确切顺序进行匹配,因此如果您两次实现相同的路由,则只会使用第一个出现的路由。

您没有提供verifiable example,所以我无法确定出了什么问题,但看起来您除了“/”之外没有定义任何路由,并且它在所有 3 个控制器中都提供(1 个显式和 2 个通过继承) .您所做的只是更改查找视图的位置,因此首先定义 BooksController 的预期行为是 GET / 导致应用程序在 app/views/books 中呈现 home.erb

您的帖子中没有任何内容表明创建ApplicationController 作为其他控制器的基类的原因。您可以从Sinatra::Base 派生所有控制器,也可以保留ApplicationController 但删除其get "/" 方法,然后从ApplicationController 派生HomePageController 并将get "/" 方法放在那里。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2015-07-25
  • 2013-03-29
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2012-09-30
相关资源
最近更新 更多