По мере того, как мы будем создавать все больше и больше приложений 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, а также для небольших приложений.
Надеюсь, вам понравился урок.
Комментарии и предложения приветствуются, как всегда.