Ruby / [Из песочницы] Использование связки Sinatra, mongodb и carrierwave, пишем простую фотогалерею

в 9:23, , рубрики: carrierwave, mongodb, mongoid, sinatra, метки: , , ,

Всем доброго времени суток!

Введение

На написание этого поста меня сподвигло слишком малое количество материала о sinatra, и тем более о данной связке. Надеюсь для кого то этот пост будет полезен. Ниже я опишу как можно совместно использовать sinatra, mongodb и carrierwave, на примере создания простой фотогалереи. Для общения между sinatra и mongodb мы будем использовать отличный gem — mongoid. По умолчанию предполагается что у вас уже установлен ruby и mongodb. Приступим.

Шаг 1

Установим необходимые gem:

gem install sinatra haml mongoid bson_ext carrierwave carrierwave-mongoid

Шаг 2

Создадим sinatra приложение:

  1. создаём каталог нашего приложения, назовём его myapp
  2. внутри каталога создаём файл index.rb, со следюущим содержимым:
    require 'rubygems' require 'sinatra'       get '/' do 'Hello from Sinatra' end 

  3. запускаем
    ruby index.rb

  4. Откываем в браузере localhost:4567, видим надпись «Hello from Sinatra» и радуемся, базовое приложение sinatra готово и работает

Шаг 3

Настроим подключение к mongodb, и создадим базу данных, для хранения информации в фотографиях в галлерее. Запишем всё это index.rb:

require 'rubygems' require 'sinatra' require 'haml' require 'bson' require 'mongoid'  #конфигурация базы данных configure do   Mongoid.configure do |config|     name = "app"     host = "localhost"     config.master = Mongo::Connection.new.db(name)     config.persist_in_safe_mode = false   end end  #Создаём документ Image(практически то же самое что и таблица в SQL базе) с атрибутом :title(название фотографии) class Image   include Mongoid::Document   field :title, type: String end   #список фотографий get '/' do   @images = Image.all   haml :'index' end  #создание новой фотографии post '/' do   @image = Image.new(:title => params['title'])   @image.save   redirect "/" end  #показ одной фотографии get '/image/:id' do   @image = Image.find(params[:id])   haml :'show' end 


Создадим диреткорию views и добавим в неё шаблоны index.haml(для отображения списка фотографий) и show.haml(для отображения одной фотографии), с содержимым:

#index.haml %h2 Photogallery %ul.photogallery -for image in @images   %li     %a{:href => "/image/#{image.id}"}=image.title  %h2 Добавить фотографию %form{:name => "new_image", :id =>"new_image", :method => "POST", :enctype => "multipart/form-data"}   %p     %label Заголовок фотографии     %br     %input{:type=>"text", :name => "title"}   %p     %input{:type=>"submit", :value => "Сохранить"}  #show.haml %h1= @image.title 


Запускаем наше приложение

ruby index.rb


заходим на localhost:4567 и видим страничку с формой добавления фотографий(пока просто заголовка фотографии), пробуем что нибудь написать туда и сохранить если всё сохранилось и отразилось, то переходим к следующему шагу, где с помощь carrierwave организуем загрузку изображений

Шаг 4

Подключим и настроим carrierwave, для того что бы этот gem правильно работал с mongoid нам необходимо поставить ещё gem carrierwave-mongoid мы его уже установили в самом начале. Ниже конечный код файлов:
index.rb, index.haml, show.haml

#index.rb require 'rubygems' require 'sinatra' require 'haml' require 'bson' require 'mongoid' require 'carrierwave' require 'carrierwave/mongoid'  #конфигурация базы данных configure do   Mongoid.configure do |config|     name = "app"     host = "localhost"     config.master = Mongo::Connection.new.db(name)     config.persist_in_safe_mode = false   end end  #конфигурация carrierwave class ImageUploader < CarrierWave::Uploader::Base   storage :file end  #Создаём документ Image(практически то же самое что и таблица в SQL базе) с атрибутом :title(название фотографии) class Image   include Mongoid::Document   mount_uploader :image, ImageUploader, type: String   field :title, type: String end  #список фотографий get '/' do   @images = Image.all   haml :'index' end  #создание новой фотографии post '/' do   @image = Image.new(:title => params['title'])   @image.image = params[:image] #загрузка изображения   @image.save   redirect "/" end  #показ одной фотографии get '/image/:id' do   @image = Image.find(params[:id])   haml :'show' end 


#index.haml %h2 Photogallery %ul.photogallery -for img in @images   %li     %a{:href => "/image/#{img.id}"}= img.title     %a{:href => "/image/#{img.id}"}       %img{:src => img.image}  %h2 Добавить фотографию %form{:name => "new_image", :id =>"new_image", :method => "POST", :enctype => "multipart/form-data"}   %p     %label Заголовок фотографии     %br     %input{:type=>"text", :name => "title"}   %p     %label Изображение     %br     %input{:type=>"file", :name => "image"}   %p     %input{:type=>"submit", :value => "Сохранить"} 


#show.haml %h1= @image.title %img{:src => @image.image} 


перезапускаем приложение, заходим на localhost:4567 и радуемся нашему приложению, ресайз изображений, редактирование и удаление я оставляю вам на домашнее задание)

Исходники лежат здесь — https://bitbucket.org/vened/imagegallery/src

Автор: maxstbn

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js