Должна ли базовая модель представлять представление или ресурс на стороне сервера?

Предположим, что у меня есть Rails AR модели, как показано ниже

class User
  has_one :profile
end

class Profile
  belongs_to user
  has_one :address
end

class Address
  belongs_to :profile
end

И иметь представление профиля пользователя, которое будет построено на стороне клиента. Теперь, как должна выглядеть моя модель Backbone? Должно ли оно повторять то, как в модели доменов на стороне Rails / сервера? Есть ли у нас четкая причина, почему так должно быть, или это просто субъективно?

Ваш обмен опытом приветствуется!

2 ответа

Решение

Обычно ваши базовые модели и коллекции должны соответствовать вашему REST API (или любым другим связям на стороне клиента <-> на стороне сервера).

  1. Например, если эти модели ruby ​​передаются во внешний интерфейс с помощью:

    GET /api/user/:id
    

    И что вы получили в ответ

    [{ profile: { address: "21st str." } },{ profile: { address: "17th str." } }]
    

    Вам понадобится одна модель

    User = Backbone.Model
    Users = Backbone.Collection.extend({
       model: User,
       url: "/api/user"
    });
    
  2. Но если вы делаете что-то более сложное в своем API и имеете больше URL в своем API, вы можете выбрать структуру, которая лучше всего подходит для вашего взаимодействия с клиентом на вашем веб-интерфейсе. Например, если ваш веб-сайт вообще не нуждается в пользовательском интерфейсе API и вы передаете данные во внешний интерфейс с такими URL-адресами:

    GET /api/profile
    

    Вы можете иметь только одну модель

    ProfileModel = Backbone.Model.extend({
        url: "/api/profile"
    })
    

    И вы можете легко установить адрес, как

    profile = new ProfileModel();
    profile.set('address', '21st str.');
    

Нижняя линия

Магистраль обычно должна следовать вашей структуре URL вашего REST API. Если вы сделаете это, вы сможете воспользоваться всеми преимуществами использования REST Ajax-вызовов ( GET, POST, DELETE, PUT) с правильной автоматической настройкой.

Обычно я не делаю так, чтобы структура моего приложения Backbone соответствовала схеме базы данных. Это может вызвать головную боль, потому что вам нужно будет создать способ, чтобы ваш бэкэнд (приложение Ruby) мог обеспечить почти тот же доступ к базе данных, что и ORM, который вы используете.

Для простоты я считаю, что модель должна представлять как модель на стороне сервера, так и состояние представления на стороне клиента, отличая атрибуты состояния представления предшествующим символом _. Атрибуты состояния вида игнорируются сервером при сохранении модели.

Вот упрощенный пример рабочего процесса, который я использую:

var animal = new View({
  initialize: function(){
    // define the model and default view state when view is initialized
    this.model = new Model({id:3, _edit:false}, {url:'/animals'));
  }
  , render: function(){
    var self = this;
    this.undelegateEvents();
    this.delegateEvents({
      'click [data-trgger]': function(e){
        self[$(e.currentTarget).attr('data-trigger')].apply(this);
      }
    });
    var success = function(){
      // pass the model to the template engine
      self.$el.html( _.template('#edit-animals', {model: self.model}) );
    }
    // fetch the model from the server when view is rendered
    // you could check if the model is already fetched
    this.model.fetch({success:success});
  }
  , onSave: function(){
    // save the model then:
    this.model.set('_edit', false);
    this.render();
  }
  , onEdit: function(){
    this.model.set('_edit', true);
    this.render();
  }
});

И шаблон:

<% if(model.get('_edit')){ %>

  <!-- the view is in 'edit' state, show input and save button -->
  <div>
    <input type="text" name="breed" class="form-control">
  </div>
  <button class="btn btn-primary" data-trigger="onSave">Save</button>

<% }else{ %>

  <!-- the view is in 'read-only' state, show values and edit button -->
  <button class="btn btn-default" data-trigger="onEdit">Edit</button>
  <div>
    <%= model.get('breed') %>
  </div>

<% } %>
Другие вопросы по тегам