Партиалы Синатры/Падрино с модальным окном

Я искал исчерпывающе, но не могу найти ответ на этот вопрос.

Я пишу небольшое приложение, используя padrino, и у меня есть 2 представления: человек и событие. У меня есть представления и контроллеры для них, и они работают нормально.

Моя проблема в том, что из представления «событие» я хочу открыть модальное окно, чтобы добавить нового человека.

Модальное окно загрузится с соответствующими полями для «человека». После заполнения полей и нажатия кнопки модальное окно исчезнет, ​​новый «человек» будет сохранен, и пользователь вернется на страницу события.

Может ли кто-нибудь дать мне совет о том, как действовать? Спасибо.


person daesu    schedule 25.02.2013    source источник


Ответы (1)


Модальное окно обычно создается с помощью javascript. Например, используя интерфейс jQuery (из документы)

<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>jQuery UI Dialog - Default functionality</title>
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.1/themes/base/jquery-ui.css" />
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
  <script src="http://code.jquery.com/ui/1.10.1/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css" />
  <script>
  $(function() {
    $( "#dialog" ).dialog();
  });
  </script>
</head>
<body>

<div id="dialog" title="Basic dialog">
  <p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p>
</div>


</body>
</html>

Sinatra/Padrino позаботится о макете и виде, вам просто нужно добавить часть сценария. Если вы используете Haml, ваше представление будет выглядеть так:

#dialog{title: "Basic dialog"}
  %p
    This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.

:javascript
  $(function() {
    $( "#dialog" ).dialog();
  });

javascript не нужно входить в теги head, как предлагают документы jQuery.


Редактировать:

Есть несколько вариантов загрузки партиала в окно. Один из них — использовать библиотеку javascript, такую ​​как Handlebars, но я предпочитаю, чтобы javascript загружал ее с маршрута таким образом. весь код просмотра остается вместе, например

get "/templates/modal1/?" do
  haml :modal1, :layout => !xhr?
end

В javascript вызовите AJAX этот маршрут, и вы получите только HTML < em>без макета, а затем используйте его для заполнения поля:

$.get('ajax/test.html', function(data) {
  $('#dialog').html(data);
}

и, на ваш взгляд, просто опишите div:

#dialog1
  -# The HTML from the view will be put here by the jQuery code.

Что-то такое.

person iain    schedule 25.02.2013
comment
Эй, Ян, спасибо за быстрый ответ. Это полезно, но мне было интересно, как я буду загружать частичные (из моей модели человека) в модальное окно? Я не хочу повторять код, и мне просто нужно загрузить «person/_form.erb» в модальное окно, а затем сохранить его. Имеет ли это смысл ? - person daesu; 25.02.2013
comment
Что касается второй части вашего вопроса, вы можете совершать вызовы XHR, чтобы получить частичные. Вы не получаете частичное использование модели. Вы бы написали этот бит кода в контроллере. - person ch4nd4n; 25.02.2013
comment
@ User79843 User79843 Я обновил ответ, надеюсь, он больше соответствует тому, что вы ищете. - person iain; 25.02.2013
comment
@ ch4nd4n Пока я писал это обновление, вы дали его описание :) - person iain; 25.02.2013