Как работает представление (MVC)? - PullRequest
1 голос
/ 25 января 2010

Я сейчас работаю над веб-приложением без фреймворка и пытаюсь структурировать его как приложение MVC. Проблема в том, что есть некоторые технические аспекты приложений MVC, которые меня избегают.

Прежде всего, как построить представление? Я хотел бы использовать язык разметки, такой как eRuby или #haml, но я не знаю, как именно они работают и как реализовать их в не-Rails-приложении.

Как представление получает данные от модели и указания от контроллера? В Rails это все запутано. Как я могу это реализовать? Какая теория стоит за этим? Я делаю соединение с моей базой данных в представлении и затем использую это свободно там? Должен ли он проходить через другую программу, кроме рендерера #haml, для передачи данных?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 января 2010

У меня пока недостаточно комментариев, чтобы ответить, но чтобы ответить на ваш вопрос об ответе 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"})

Надеюсь, это устранит некоторую путаницу:)

1 голос
/ 26 января 2010

Простой кейс:

ERB.new("your_template.erb").result(binding)

Это оценит шаблон в контексте того, где он называется.

Мой предпочтительный / упрощенный способ сделать это - просто вызвать его внутри контроллера, разобраться с контроллером и немного слить представление.

Если вы не хотите этого делать, вам нужно создать класс представления, который имеет следующий метод:

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)] ]

Или ... просто оставьте и используйте синатру.

...