Не так давно DHH оголосив, що Rails 5.2 матиме новий компонент під назвою ActiveStorage. Він буде керувати завантаженням файлів безпосередньо за допомогою Rails.
Відтоді було зроблено важливі кроки в інтеграції ActiveStorage в Rails і ви вже сьогодні можете фактично використовувати ActiveStorage. В цій статті описано процес оновлення застосунку на Rails для використання ActiveStorage.
Попередження! Ви будете використовувати Rails нестабільної версії, тож можуть виникнути непередбачувані проблеми.
Налаштування ActiveStorage для Rails
- Якщо ви користуєтеся версією Rails нижче 5.1.14, то вам слід оновити Rails до 5.1.14, оновивши ваш Gemfile.
gem 'rails', '~> 5.1', '>= 5.1.4'
- Виконайте команду
$ bundle update rails
. - Запустіть
$ rails app:update
і виправте розбіжності в коді. - Впевніться, що перехід на версію 5.1.14 пройшов нормально.
- Тепер ми оновимо Rails до останньої версії. Додайте наступні рядки до вашого Gemfile:
git_source(:github) do |repo_name|
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
"https://github.com/#{repo_name}.git"
end
...
gem 'rails', github: 'rails/rails'
gem 'arel', git: 'https://web.archive.org/web/20230321051012/https://github.com/rails/arel.git'
gem 'bootsnap', '~> 1.1', '>= 1.1.5', require: false
- Запустіть
$ bundle update rails
. -
$ bundle exec rails -v
має відобразити останню версію,Rails 5.2.0.alpha
. - Оновіть конфіги вашого застосунку. Запустіть
$ bundle exec rails app:update
. - Коли ви виконуєте
$ ./bin/rails --tasks
, ви повинні побачити у доступних командахrails active_storage:install
. - Запустіть
$ ./bin/rails active_storage:install
, щоб згенерувати файл міграції. - Виконайте
$ ./bin/rails db:migrate
. Тепер база данихsqlite
має бути готова до роботи з ActiveStorage.
Простий приклад завантаження зображення з ActiveStorage
Досі ми лише готували застосунок до роботи з ActiveStorage. Тепер, коли все налаштовано і додаток може використовувати ActiveStorage, ми можемо перейти до практики:
Напишемо просту функцію, яка дозволить нам створювати повідомлення з зображеннями, які використовують ActiveStorage.
- Створіть модель post:
$ ./bin/rails g model post
. - Додайте у файлі міграції до таблиці
post
дві колонки:title
таbody
.
# db/migrate/20171114063756_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.2]
def change
create_table :posts do |t|
t.string :title
t.text :body
t.timestamps
end
end
end
- Створіть контролер для ресурсів повідомлень.
$ ./bin/rails g controller posts
. - Додайте до нього шлях в
config/routes.rb
.
Rails.application.routes.draw do
resources :posts
end
- Нам необхідно зв'язати повідомлення з зображеннями.
class Post < ApplicationRecord
has_many_attached :images
end
- Необхідно додати код індексу, відображення і створення дій.
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
# we will display post form here
def index
@post = Post.new
end
# we will create post here
def create
post = Post.create! params.require(:message).permit(:title, :body)
post.images.attach(params[:message][:images])
redirect_to post
end
# we will display post with photo
def show
@post = Post.find(params[:id])
end
end
- Додамо представлення
index.html.erb
для повідомлень використовуючи наступний код. Він буде відображати завантаженняlocalhost:3000/posts
.
# app/views/posts/index.html.erb
<%= form_with model: @post, local: true do |form| %>
<%= form.text_field :title, placeholder: "Title" %><br>
<%= form.text_area :body %><br><br>
<%= form.file_field :images, multiple: true %><br>
<%= form.submit %>
<% end %>
- Додамо представлення для відображення повідомлень.
# app/views/posts/show.html.erb
<%= image_tag @post.images.first %>
- Спробуйте завантажити фото, і ви побачите, як представлення
show
відобразить зображення, яке ви щойно надіслали.
Тепер зображення зберігається локально, в каталозі storage
, на базовому рівні застосунку. Але ви можете налаштувати все так, щобфайли зберігались у хмарних сервісах типу AWS S3, Google Cloud, Azure.
Як ви можете бачити, ActiveStorage являє собою спрощену, проте добре інтегровану з компонентом ActiveRecord, систему керування файлами. ActiveStorage тільки почав свій шлях, проте ми вже можемо бачити, що він покриває більшу кількість завдань пов'язаних з керуванням файлами. Хоча для Rails існують інші системи керування файлами, я пропоную вам роздивитися в першу чергу саме ActiveStorage.
Також вам слід ознайомитися з документацією.
І ви можете переглянути остаточний код на github.
Ще немає коментарів