Статьи

Представьте свой Rails CRUD браузеру с привязкой к данным

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

Надеюсь, вам понравился урок.

Комментарии и предложения приветствуются, как всегда.