我的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
行)使“ /”路由按预期工作。我的代码肯定击中了正确控制器的正确方法。只是在错误的位置寻找视图。
答案 0 :(得分:1)
在Sinatra中,路由将按照代码中定义的确切顺序进行匹配,因此,如果您两次实施相同的路由,则只会使用最先出现的路由。
您没有提供verifiable example,所以我不能确定哪里出了问题,但是您似乎没有定义任何路由,而是定义了“ /”,并且在所有3个控制器中提供了该路由(1个显式,2个由遗产)。您所做的只是更改查找视图的位置,因此,首先定义BooksController的预期行为是GET /
导致应用在home.erb
中呈现app/views/books
。
您的帖子中没有任何内容说明创建ApplicationController
作为其他控制器的基类的原因。您可以只从Sinatra::Base
派生所有控制器,也可以保留ApplicationController
但删除其get "/"
方法,然后从HomePageController
派生ApplicationController
并将{ {1}}方法。