(Ruby, Rails) Вложенные в CRUD модели более 4 уровней на одной странице ...? - PullRequest
2 голосов
/ 10 июня 2009

Столько удивительной информации, сколько есть, часто кажется, что она не соответствует моим безумным требованиям. Тем не менее, я ищу механизм, с помощью которого можно обрабатывать несколько вложенных моделей на одной странице.

Теперь я видел все видео и посты (не совсем, но приколите меня) о вложении двух моделей (Railscasts и т. Д.). Однако мне нужно иметь дело с моделями, вложенными в 4 глубины, все время используя Javascript для поддержания чистоты страницы.

В основном у меня есть Сайт -> Здания -> Контроллеры -> Измерения, и я хотел бы управлять (CRUD) целым сайтом на одной странице. Я уверен, что возможно , но мне еще предстоит увидеть достаточно чистый метод, которым я могу обернуть голову. Если у кого-то есть какой-либо вклад, у меня все уши (или глаза в зависимости от обстоятельств).

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 10 июня 2009

Некоторые опытные программисты рекомендуют только вложенные ресурсы глубиной 1 уровень . Конечно, ваш домен может быть более сложным, но вы не должны раскрывать всю эту сложность в одном представлении. Если вам действительно нужно для управления всем сайтом на одной странице, я рекомендую вам использовать несколько форм и обновлять различные дисплеи с помощью AJAX, а не пытаться делать все это в одной форме. Вы получите лучший юзабилити и более чистый код.

EDITED

Хорошо, вот примерное представление в HAML:

%h1 Editing Site
#site-form
  - form_for @site, :class => 'remote', :'data-update' => '#site-form' do |f|
    %p
      = f.label :name
      = f.text_field :name
    %p
      [All the other fields on your Site model]
    %p
      = f.submit "Save Site"


%h2 
  Buildings for 
  = @site.name
#buildings-forms
  - for building in @site.buildings
    %div{ :id => "building-#{building.id}" }
      - form_for building, :class => 'remote', :'data-update' => "#building-#{building.id}" do |f|
        %p
          = f.label :name
          = f.text_field :name
        %p
          [All other building fields]
        %p
          = f.submit "Save Building"    
      %h3 
        Controllers for
        = building.name
        - for cntroller in building.controllers
          %div{ :id => "controller-#{cntroller.id}"}
            - form_for cntroller, :class => 'remote', :'data-update' => "#controller-#{cntroller.id}" do |f|
              %p
                = f.label :name
                = f.text_field :name
              %p
                [All other controller fields]
              %p
                = f.submit "Save Controller"

И следующий уровень, Измерения, будет выглядеть примерно так же.

Что касается получения AJAX, в jQuery вы говорите:

$( function() {
  $('form.remote').submit( function() {
    var submitted_form = this;
    $.post( this.action, $.serialize(this), function( data_returned, status, request ) {
      var updated_block = $( data_returned ).find( $(submitted_form).attr('data-update').html();
      $( $(submitted_form).attr('data-update') ).html( updated_block );
    } );
    return false;
  } );

});

Это позволяет каждой форме публиковать и обновлять свой обновляемый блок новой версией с сервера после того, как сообщение произошло. Вы можете стать более любопытным и использовать плагин метаданных для хранения информации о том, какой блок должен быть обновлен, и другой информации о запросе, но это просто и позволяет вам увидеть конфигурацию в вашем html. Атрибуты data-x являются запланированной функцией HTML5, но мы все равно можем их использовать.

Создавая соглашение для ваших удаленных форм, легко заставить jQuery обрабатывать все ваши сообщения ajax с небольшим количеством кода. Вы, вероятно, захотите некоторые более интересные вещи, бланки, валидации и т. Д. Есть место для этого, но это поможет вам начать с одностраничного интерфейса.

1 голос
/ 10 июня 2009

Выезд http://activescaffold.com/ и Обтекаемый - http://streamlinedframework.org/ обе поддерживают вложенные модели на странице.

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

0 голосов
/ 10 июня 2009

Я думаю, что самым простым способом было бы разбить его на пары «родитель-> потомок»:

  • сайт-> Строительство
  • застройки-> Контроллер
  • эксплуатации контроллеров> Измерение

Тогда у вас простые отношения между всеми 4.

...