Установить папку представлений для ApplicationController в Sinatra без переопределения - PullRequest
0 голосов
/ 11 октября 2018

В моем приложении Sinatra есть три контроллера: базовый ApplicationController и AuthorsController и BooksController, каждый из которых наследуется от ApplicationController.

Моя файловая структура для представлений:

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

Iустановили папку представлений для книг с set :views, "app/views/books" в верхней части BooksController, и авторы аналогично;обе работают.

В ApplicationController определен только один маршрут:

class ApplicationController < Sinatra::Base

    set :views, "app/views"

    get "/" do
        erb :home
    end

end

Когда я перехожу к «/», он ищет домашний вид в папке «Книги» или в контроллере авторов, в зависимости от того, какой из них приходит.сначала в моем файле config.ru:

require_relative './config/environment'

use BooksController
use AuthorsController
run ApplicationController

Комментирование других контроллеров (или только строки set :views внутри них) делает маршрут "/" ожидаемым.Мой код определенно соответствует правильному методу правильного контроллера;он просто ищет вид в неправильном месте.

1 Ответ

0 голосов
/ 31 января 2019

В Синатре маршруты сопоставляются в точном порядке, который они определены в вашем коде, поэтому, если вы реализуете один и тот же маршрут дважды, будет использоваться только тот, который указан первым.

Вы этого не сделалипредоставьте проверяемый пример , поэтому я не могу быть уверен, что не так, но похоже, что вы не определили какой-либо маршрут, кроме "/", и он предоставляется во всех 3 контроллерах (1 явно и 2 по наследству).Все, что вы сделали, это изменили, где искать представления, поэтому ожидаемое поведение определения BooksController вначале будет таким, что GET / приведет к тому, что приложение отобразит home.erb в app/views/books.

В вашем посте нет ничего, что указывало бы на необходимость создания ApplicationController в качестве базового класса для других ваших контроллеров.Вы можете либо просто извлечь все свои контроллеры из Sinatra::Base, либо оставить ApplicationController, но удалить метод get "/", затем извлечь HomePageController из ApplicationController и поместить туда метод get "/".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...