Вопрос

Прямо сейчас я работаю над веб-приложением без фреймворка и пытаюсь структурировать его как приложение 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top