Как работает представление (MVC)?
-
22-09-2019 - |
Вопрос
Прямо сейчас я работаю над веб-приложением без фреймворка и пытаюсь структурировать его как приложение MVC.Проблема в том, что есть некоторые технические аспекты приложений MVC, которые ускользают от меня.
Прежде всего, как должно быть построено представление?Я бы хотел использовать язык разметки, такой как eRuby или #haml, но я не знаю, как именно они работают и как их реализовать в приложении, отличном от Rails.
Как представление получает данные из модели и указания от контроллера?В Rails все это запутано.Как я могу это реализовать?Какая теория стоит за этим?Могу ли я установить соединение со своей базой данных в представлении, а затем свободно использовать ее там?Должен ли я передать его через другую программу, помимо просто средства визуализации #haml, чтобы передать ему данные?
Спасибо!
Решение
У меня пока недостаточно баллов для комментариев, но чтобы ответить на ваш вопрос по ответу cwninja, в большинстве случаев вы отображаете форму просмотра в рамках действия контроллера.Контроллер получает запрос, выполняет нужное действие и возвращает ответ, в данном случае визуализированное представление в качестве тела ответа.Простой пример использования haml может выглядеть следующим образом:
class SomeController
def some_action
@foo = "bar"
Haml::Engine.new(template).render(self)
end
end
В этом случае переменные экземпляра, настроенные в контроллере, автоматически станут доступны для представления, поскольку они определены в одном контексте.Переменные из модели не будут доступны, поскольку они не должны, однако все, к чему вы можете получить доступ из действия контроллера, может быть доступно из представления.Большинство систем шаблонов также позволяют передавать хэш локальных переменных в представление, например:
Haml::Engine.new(template).render(self, {:foo => "bar"})
Я надеюсь, что это немного прояснит ваше замешательство :)
Другие советы
Простой случай:
ERB.new("your_template.erb").result(binding)
Это позволит оценить шаблон в контексте того, где он вызывается.
Мой предпочтительный / упрощенный способ сделать это - просто вызвать его внутри контроллера и разобраться с тем, что контроллер и представление немного объединены.
Если вы не хотите этого делать, вам нужно создать класс view, который имеет следующий метод:
def get_binding
binding
end
Затем создайте новый экземпляр, установив все переменные экземпляра по мере необходимости в представлении, затем вызовите:
view = ViewClass.new
view.object = my_data_from_the_db
return [200, {…}, [ERB.new("your_template.erb").result(view.get_binding)] ]
Или ... просто откажись от an и используй sinatra.