В Части 1 мы создали спокойный API с использованием рельсов.

Во Части 2 мы создали наш конвейер ресурсов для использования angular и установили Bower.

В третьей части мы создали базовое приложение angular с вложенными маршрутами, используя UI.router.

В части 4 мы собираемся использовать $resource для создания интерфейса нашего приложения Angular с нашим API RESTful Rails.

Если вы это сделали, прежде чем приступить к этому разделу, убедитесь, что вы выполнили части 1–3, в противном случае это может работать неправильно.

Шаг: 1 Проверка нашей базы данных

Еще в части 1 мы создали простую базу данных с одной записью примечания.

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

$ rails c
2.2.1 :001 > @note = Note.create(title: 'First Note', body: 'This is my first note')

Это создаст наш первый объект заметки.

В последнем уроке внутри нашего контроллера заметок у нас есть массив объектов

ctrl. notes = [ 
  { 
    title: 'first note', 
    body: 'this is my first note'
  },
  { 
    title: 'second note', 
    body: 'this is my second note' 
  } 
];

наша первая цель с ресурсом — теперь очистить этот массив и получить объекты из нашей базы данных Active Record в нашем приложении rails.

В настоящее время нам требуется ngResource. $resource — это служба, используемая для вызовов API, и в нее встроен CRUD. Итак, сначала убедитесь, что ngResource внедрен в ваш файл app.js.

angular
  .module('app', ['ui.router', 'ngResource', 'templates')

Мы должны быть настроены и готовы к работе.

Шаг: 2 Создание запроса()

Первое, что мы хотим сделать, это подключить наш .state('notes'), чтобы мы могли видеть все наши заметки, хранящиеся в базе данных.

Сначала нам нужно сделать фабрику. Пожалуйста, создайте следующий файл.

app/assets/javascripts/angular-app/models/note.js

нам нужно использовать наш $resource внутри этой модели.

# app/assets/javascripts/angular-app/models/note.js
angular 
  .module('app')
  .factory('Note', Note)
function Note($resource) {
  
  var Note = $resource('http://localhost:3000/api/v1/notes/:id.json', {id: '@id'}, {
  update: { method: 'PUT' }
});
  return Note; 
}

Теперь, когда у нас есть фабрика Note, у нас есть доступ к нескольким методам.

  1. получить()
  2. запрос()
  3. спасти()
  4. Удалить()
  5. Удалить()

Давайте используем query() в нашем NotesController.js.

angular 
  .module('app') 
  .controller('NotesController', NotesController);
function NotesController(Note) {
  
  var ctrl = this; 
  // change our ctrl.notes = []; to query the entire Note table
  ctrl.notes = Note.query();
};

Теперь, когда мы загружаем наш браузер по адресу localhost:3000/#/notes, мы должны увидеть единственную заметку внутри нашей базы данных.

Шаг: 3 новая заметка()

Теперь, когда наша фабрика построена с использованием $resource, мы можем создавать экземпляры этой фабрики и создавать новые записи внутри нашей базы данных.

давайте создадим новый контроллер для этого.

# app/assets/javascripts/angular-app/controller/NewNoteController.js
angular 
  .module('app') 
  .controller('NewNoteController', NewNoteController); 
function NewNoteController(Note, $location) {
  // we will use $location to route back to another state
  var ctrl = this; 
  // make a new note 
  ctrl.note = new Note();
  ctrl.addNote = function() {
    ctrl.note.$save(function() {
      $location.path('notes');
    });
  };
}

Мы будем использовать метод addNote() внутри формы @ new.html. Вы заметите $location. Это используется, чтобы направить нас обратно к нашему маршруту «заметок», и мы должны увидеть там новую заметку, но сначала нам нужно исправить две вещи. 1 наш контроллер app.js .state для «home.new» и наш файл home/new.html.

# app.js
.....
.state('home.new', {
  url: 'new',
  templateUrl: 'home/new.html',
  // use our NewNoteController, so that our form has access to it.
  controller: 'NewNoteController as ctrl'
})
......

наш взгляд:

# home/new.html
<h1>Add note</h1>
<form validate ng-submit=”ctrl.addNote()”>
 <label>Title</label>
 <input type=”text” ng-model=”ctrl.note.title”>
 <label>Content</label>
 <input type=”text” ng-model=”ctrl.note.body”>
 <input type=”submit” value=”Add Note”>
</form>

с ng-submit, когда мы нажимаем кнопку «Добавить заметку», мы создаем новый объект в нашей базе данных. Идите вперед и загрузите localhost:3000/#/new и создайте новую запись. После того, как вы нажмете кнопку «Добавить заметку», вы также должны пройти по маршруту /#/notes, и вы должны увидеть свою новую заметку.

Шаг: 4 Note.get()

Таким образом, мы можем запросить всю нашу таблицу базы данных и вставить ее в нашу таблицу, но как нам получить конкретную строку из нашей таблицы? Мы собираемся «получить ()» это.

Давайте создадим новое представление для отображения этой отдельной заметки.

app/assets/javascripts/templates/home/show.html
<h3>{{ ctrl.note.title }}</h3>
<p>
 {{ ctrl.note.body }}
</p>

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

angular
  .module(‘app’, [‘ui.router’, ‘ngResource’, ‘templates’])
  .config(function($stateProvider, $urlRouterProvider) {
    $stateProvider
      .state(‘home’, {
        url: ‘/’,
        templateUrl: ‘home.html’,
        controller: ‘HomeController as ctrl’
      })
      .state(‘home.notes’, {
        url: ‘notes’,
        templateUrl: ‘home/notes.html’,
        controller: ‘NotesController as ctrl’
      })
      .state(‘home.new’, {
        url: ‘new’,
        templateUrl: ‘home/new.html’,
        controller: ‘NewNoteController as ctrl’
      })
      .state(‘home.note’, {
        url: ‘note/:id’,
        templateUrl: ‘home/show.html’,
        controller: ‘ViewNoteController as ctrl’
      });
 
    $urlRouterProvider.otherwise(‘/’);
  });

Теперь давайте обновим наш home/notes.html

<h1>Notes</h1>
<ul>
  <li ng-repeat=”note in ctrl.notes”>
    <h3>{{ note.title }}</h3>
    <p>
      {{ note.body }}
    </p>
    <a href=”#” ui-sref=”home.note({id: note.id})”>View Note</a>
  </li>
</ul>

Это даст нам ссылку на страницу показа каждой заметки. Нам не хватает еще одной вещи, нашего контроллера. Создайте этот контроллер и добавьте следующий код.

angular
 .module(‘app’)
 .controller(‘ViewNoteController’, ViewNoteController);
function ViewNoteController(Note, $stateParams) {
   
  var ctrl = this;
  ctrl.note = Note.get({ id: $stateParams.id });
}

Снова загрузите браузер, и вы сможете просматривать заметки каждого отдельного человека.

Шаг: 5 $обновить()

Нам по-прежнему не хватает нашей функции редактирования заметок, позволяющей добавить ее в маршруты файлов app.js.

# app/assets/javascripts/angular-app/app.js
.state(‘home.edit’, {
  url: ‘edit/:id’,
  templateUrl: ‘home/edit.html’,
  controller: ‘EditNoteController as ctrl’
})

Наш новый EditNoteController

# app/assets/javascripts/angular-app/controllers/EditNoteController.js

angular
 .module(‘app’)
 .controller(‘EditNoteController’, EditNoteController);
function EditNoteController(Note, $location, $stateParams) {
  var ctrl = this;
  ctrl.note = Note.get({ id: $stateParams.id });
  ctrl.editNote = function() {
    ctrl.note.$update(function() {
      $location.path(‘notes’);
    });
  };
}

Это возьмет наш текущий $stateParams :id для поиска этого идентификатора в нашей базе данных. Теперь мы можем редактировать нашу заметку в нашей форме.

Давайте создадим нашу форму edit.html

# app/assets/javascripts/templates/home/edit.html
<h1>Edit note</h1>
<form validate ng-submit=”ctrl.editNote()”>
  <label>Title</label>
  <input type=”text” ng-model=”ctrl.note.title”>
  <label>Content</label>
  <input type=”text” ng-model=”ctrl.note.body”>
  <input type=”submit” value=”Update Note”>
</form>

Он очень похож на наш new.html, мы просто изменили функцию в нашем ng-submit. Мы можем преобразовать это позже в партиал, но сейчас мы оставим его.

Теперь у нас есть возможность редактировать наши заметки, но нам нужна ссылка на наш новый маршрут. Давайте добавим это в наш файл home/notes.html:

# home/notes.html
<h1>Notes</h1>
<ul>
  <li ng-repeat=”note in ctrl.notes”>
    <h3>{{ note.title }}</h3>
    <p>
      {{ note.body }}
    </p>
    <a href=”#” ui-sref=”home.note({id: note.id})”>View Note</a>
    <a href=”#” ui-sref=”home.edit({id: note.id})”>Edit Note</a>
  </li>
</ul>

И home/show.html:

# home/show.html
<h3>{{ ctrl.note.title }}</h3>
<p>
  {{ ctrl.note.body }}
</p>
<a href=”#” ui-sref=”home.edit({id: ctrl.note.id})”>Edit Note</a>

Давайте теперь перейдем к нашему браузеру и отредактируем эти файлы.

Шаг: 6 $удалить()

Теперь пришло время добавить последнюю часть CRUD. Уничтожить/удалить.

Давайте добавим метод в наш NotesController.js.

# controllers/NotesController.js

angular
  .module(‘app’)
  .controller(‘NotesController’, NotesController);
function NotesController(Note, $location, $state) {
  var ctrl = this;
  ctrl.notes = Note.query();
  ctrl.deleteNote = function(note) {
    note.$delete(function() {
      $state.go($state.current, {}, {reload: true});
    });
  };
};

Это удалит нашу заметку и перезагрузит наше текущее состояние «заметок».

Давайте добавим эту функцию в наш notes.html.

# home/notes.html
<h1>Notes</h1>
<ul>
  <li ng-repeat=”note in ctrl.notes”>
    <h3>{{ note.title }}</h3>
    <p>
      {{ note.body }}
    </p>
    <a href=”#” ui-sref=”home.note({id: note.id})”>View Note</a>
    <a href=”#” ui-sref=”home.edit({id: note.id})”>Edit Note</a>
    <a href ng-click=”ctrl.deleteNote(note)”>Delete Note</a> 
  </li>
</ul>

Теперь у нас должна быть ссылка для удаления нашей заметки на нашей странице «заметки». Запустите сервер rails и перейдите на localhost:3000/#/notes и посмотрите, сможете ли вы удалить заметку.

Поздравляем!!!!

Вы только что создали базовое приложение CRUD с использованием Angular.js и Rails.

Пожалуйста, оставьте любые комментарии, вопросы или рекомендации, которые у вас есть ниже.

Спасибо

Ссылки:

Часть 1
Часть 2
Часть 3