По мере того, как мы будем создавать все больше и больше приложений JavaScript, потребность в API будет расти. Написание полноценного API требует довольно много времени и планирования. Но иногда все, что нам требуется в API, это обычные действия CRUD. Написание CRUD API для каждого ресурса может быть довольно утомительной и повторяющейся задачей. Сообщество Ruby, каким бы оно ни было, некоторые предприимчивые разработчики предприняли попытку решить скуку. Сегодня мы попробуем гем, который упростит создание этих API на основе CRUD в приложении Rails. Давайте начнем.
Создание приложения Rails
Мы создадим базовое приложение Rails с моделью Contact. Приложение будет использовать MRI Ruby, Rails 4.2 и SQLite для упрощения работы. Прежде всего, установите MRI Ruby с помощью RVM или rbenv .
Переключитесь на Ruby и gem install rails для gem install rails чтобы получить последний гем Rails. Теперь создайте новое приложение Rails, вот так:
rails new databound_rails -T
После создания приложения создайте модель контакта:
cd databound_rails rails g model Contact name:string address:string city:string phone:string
Перенос базы данных:
rake db:migrate
Теперь у нас есть контактная модель на месте. Мы создадим интерфейс CRUD позже.
Установка базы данных
Теперь мы интегрируем гем Databound в наше приложение Rails. Мы также добавим драгоценный камень ‘lodash-rails’, так как от него зависит Databound. Вот так:
gem 'databound', '3.1.3' gem 'lodash-rails', '3.10.1'
Мы используем версию 3.x ‘lodash’ из соображений совместимости.
Установите оба камня:
bundle install
Databound поставляется с генератором для добавления необходимых файлов в наше приложение, поэтому запустите его:
rails g databound:install
Это добавляет databound.js к нашему конвейеру активов. Вам нужно будет вручную добавить ‘lodash’ в app / assets / javascripts / application.js , чтобы он подхватывался конвейером ресурсов:
//= require lodash //= require databound
Привязка данных будет уже добавлена в application.js , но вы должны помнить, что перед вводом данных требуется ‘lodash’.
Настройка привязки данных
Давайте использовать Databound с нашей моделью контактов. Сначала измените config / rout.rb, чтобы добавить маршруты с привязкой к данным для модели контактов:
Rails.application.routes.draw do databound :contacts end
Как видите, мы добавили маршрут с привязкой к данным для модели контакта.
Databound сгенерирует контроллер с именем ContactsController автоматически во время выполнения, если он не найден. Для простых моделей эта функция может сэкономить время написания контроллеров для каждой модели. Здесь мы также можем указать доступные для API столбцы, например:
databound :contacts, columns: [:name, :address, :city, :phone]
Но мы создадим ContactsController так как мы будем изучать более сложные параметры, предоставляемые Databound, и, следовательно, будем настраивать столбцы в самом контроллере.
Давайте ContactsController со следующим кодом:
class ContactsController < ApplicationController databound do model :contact columns :name, :address, :city, :phone end end
Здесь мы определили model как :contact , наряду со columns , которые доступны из API здесь вместо того, чтобы делать это в rout.rb. Теперь, когда мы вызываем API, только эти указанные столбцы могут быть доступны или изменены.
Строительство фронтенда
У нас есть готовый бэкэнд. Давайте создадим простой интерфейс на основе jQuery для тестирования API. Сначала добавьте действие в наш ContactsController для отображения страницы контактов.
В app / controllers / contacts_controller.rb добавьте следующее:
def index end
Вам нужно добавить маршрут для этого действия в config / rout.rb :
get 'contacts' => 'contacts#index'
Создайте представление для действия в app / views / contacts / index.html.erb со следующим кодом:
<h1>Contacts</h1> <table border="0"> <tr> <td colspan="2"><h3>Create Contact</h3></td> </tr> <tr> <td><strong>Name:</strong></td> <td><input name="txtName" id="txtName" /></td> </tr> <tr> <td><strong>Address:</strong></td> <td><input name="txtAddress" id="txtAddress" /></td> </tr> <tr> <td><strong>City:</strong></td> <td><input name="txtCity" id="txtCity" /></td> </tr> <tr> <td><strong>Phone:</strong></td> <td><input name="txtPhone" id="txtPhone" /></td> </tr> <tr> <td colspan="2" align="center"><button name="createContact" id="createContact">Create Contact</button></td> </tr> </table> <table border="0" id="tblContacts"> <thead> <th>Name</th> <th>Address</th> <th>City</th> <th>Phone</th> </thead> <tbody> </tbody> </table>
Здесь мы создали простой интерфейс для создания нового контакта и отображения его в таблице ниже. Теперь мы создадим contacts.js в app / assets / javascripts, чтобы оживить представление:
var Contact = new Databound('/contacts'); $(document).ready(function(){ $('#createContact').on('click', function() { Contact.create({ name: $('#txtName').val(), address: $('#txtAddress').val(), city: $('#txtCity').val(), phone: $('#txtPhone').val() }).then(function(new_contact) { var table = $('#tblContacts tbody'); var row = "<tr>"; row += "<td>" + new_contact.name + "</td>"; row += "<td>" + new_contact.address + "</td>"; row += "<td>" + new_contact.city + "</td>"; row += "<td>" + new_contact.phone + "</td>"; row += "</tr>"; $(table).append(row); }); }); });
Мы определили объект Contact Javascript, который мы будем использовать для вызова действий CRUD в модели Contact:
var Contact = new Databound('/contacts');
Далее, есть простой обработчик события для кнопки createContact для вызова Contact.create , передавая данные из полей Name, Address, City и Phone. Наконец, добавьте созданную запись в таблицу.
Давайте проверим, работает ли это. Запустите сервер Rails:
rails s
Нажмите http: // localhost: 3000 / conatcts и создайте несколько записей. Записи должны быть созданы и видны в таблице.
Теперь мы успешно интегрировали Databound в наш API. Давайте рассмотрим другие функции, предоставляемые Databound.
API поиска
Databound предоставляет три клиентских API для поиска записей. Давайте посмотрим их один за другим.
where API
Contact.where({ name: 'Devdatta' }).then(function(contacts) { alert('Contacts named Devdatta'); });
Здесь мы вызываем API where для поиска контактов, name полей которых совпадают с Devdatta. Соответствующие записи возвращаются в объекте contacts .
find API
Contact.find(1).then(function(contact) { alert('Contact ID 1: ' + contact.name); });
Здесь мы можем найти конкретный контакт с его первичным ключом, используя API find . Мы передали первичный ключ как «1» и получили соответствующую запись в объекте contact .
API findBy
Contact.findBy({ name: 'Devdatta' }).then(function(contact) { alert('Contact named Devdatta from ' + contact.city); });
API findBy похож на where но вы можете указать только одно поле для поиска. Здесь мы ищем с name поля, совпадающим с ‘Devdatta’. Соответствующая запись возвращается в contact объект.
Мы также можем указать область поиска по умолчанию, используя extra_where_scopes при инициализации API. Вот так —
var Contact = new Databound('/contacts', { city: 'Pune' }, { extra_where_scopes: [{ city: 'Mumbai' }] } );
Обновление и удаление API
Databound также обеспечивает update и destroy API для редактирования и удаления записей соответственно.
Обновить API
Contact.update({ id: 1, name: 'John' }).then(function(contact) { alert("My name has changed. I'm " + contact.name); });
Используя API update Databound, мы можем обновить поля записи, как указано. Только доступные данные столбцов будут обновлены, как указано в контроллере. После обновления объект контакта возвращается с обновленными данными.
Удалить API
Contact.destroy(1).then(function(status) { if (status.success) alert('Contact deleted'); });
Записи удаляются с помощью API destroy который принимает первичный ключ записи в качестве аргумента и возвращает статус как true или false.
Разрешить действия
Databound также позволяет указать, какие действия разрешены на основе определенных условий, которые могут быть вызваны с помощью API. Например:
permit(:update, :destroy) do |params, record| record.user_id == current_user.id end
(Поскольку в нашем примере мы не настроили механизм аутентификации, он не будет работать напрямую в нашем приложении)
Завершение
Сегодня мы получили краткое введение в Databound и его использование в приложении Rails. Многим Rubyists может не понравиться способ работы Databound, поскольку он довольно тесно связывает ваш код веб-интерфейса с базой данных. Однако иногда бывают случаи, когда простота решения превосходит архитектурную чистоту. Привязка данных заслуживает жесткого взгляда на такие сценарии. Это полезно для быстрого прототипирования API, а также для небольших приложений.
Надеюсь, вам понравился урок.
Комментарии и предложения приветствуются, как всегда.

