在Sinatra中为ApplicationController设置views文件夹而不覆盖

时间:2018-10-11 17:51:49

标签: ruby sinatra

我的Sinatra应用程序中有三个控制器:基本的ApplicationController以及分别从ApplicationController继承的AuthorsController和BooksController。

我的视图文件结构是:

|-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行)使“ /”路由按预期工作。我的代码肯定击中了正确控制器的正确方法。只是在错误的位置寻找视图。

1 个答案:

答案 0 :(得分:1)

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

您没有提供verifiable example,所以我不能确定哪里出了问题,但是您似乎没有定义任何路由,而是定义了“ /”,并且在所有3个控制器中提供了该路由(1个显式,2个由遗产)。您所做的只是更改查找视图的位置,因此,首先定义BooksController的预期行为是GET /导致应用在home.erb中呈现app/views/books

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