Filopplasting er en viktig funksjon i webapplikasjoner. Bortsett fra at brukerne kan laste opp profilbilder, varierer bruken av filopplastingsfunksjoner. Jeg har vist deg hvordan du aktiverer filopplasting i din Rails-applikasjon ved hjelp av forskjellige edelstener. I dag vil jeg vise deg hvordan du gjør det samme ved hjelp av Dragonfly.
Dragonfly er en svært tilpassbar Ruby perle for håndtering av bilder og andre vedlegg og er allerede i bruk på tusenvis av nettsteder.
Du kan få en oppgave for å aktivere filopplasting i et Rails-program, og kan ikke bruke de andre edelstenene som er der ute. Du kan gi Dragonfly et skudd, og du vil definitivt ikke angre på det.
I denne opplæringen vil du opprette en enkel Rails applikasjon; Jeg heter min Dragon-Uploader. Søknaden har bare en funksjon: bildeopplasting.
For å bruke dragonfly, trenger du ImageMagick installert på maskinen din. Følg noen av trinnene nedenfor, avhengig av operativsystemet.
Mac-brukere:
brygge installasjon imagemagick
Ubuntu brukere:
sudo apt-get install imagemagick
skinner nye drageopplasteren -T
De -T
alternativet sikrer at søknaden din Rails blir generert uten standard testing suite.
Gå til din Gemfile
og legg til dragonfly
perle.
#Gemfile perle 'dragonfly', '~> 1.0', '> = 1.0.12'
Ikke glem å pakke.
bunt installasjon
La oss generere vår kontroller.
skinner genererer kontroller Bilder
Det første trinnet for å integrere Dragonfly i din Rails-applikasjon er å drive kommandoen Dragonfly Generation fra din terminal.
skinner genererer dragonfly
Dette vil opprette en initialiseringsfil for Dragonfly i din config / initializers
mappe.
Filen ser slik ut:
# config / intializers / dragonfly.rb krever "dragonfly.rb krever" dragonfly "# Konfigurer Dragonfly.app.configure gjør plugin: imagemagick secret" e83b8affbf1c807c7788c07d27e70e79fb0459f8e2c4375b59e60a3da11631e5 "url_format" / media /: jobb /: navn "datastore: file, root_path: Rails.root.join 'public / system / dragonfly', Rails.env), server_root: Rails.root.join ('public') slutt # Logger Dragonfly.logger = Rails.logger # Monter som middleware Rails.application.middleware.use Dragonfly :: Middleware # Legg til modellfunksjonalitet hvis definert? (ActiveRecord :: Base) ActiveRecord :: Base.extend Dragonfly :: Modell ActiveRecord :: Base.extend Dragonfly :: Modell :: Validations end
skinner generere modellfoto
# app / models / photo.rb klasse bilde < ActiveRecord::Base dragonfly_accessor :image end
Dragonfly gir en accessor som du må legge til i din modell. Med dette kan du lese og skrive bilder.
Gå nå til din overføringsfil og legg til kolonner.
# xxx_create_photos.rb klasse CreatePhotos < ActiveRecord::Migration def change create_table :photos do |t| t.string :image_uid t.string :title t.timestamps null: false end end end
Merk: Hvis du bruker avatar
og ikke bilde
Som jeg gjorde ovenfor, bør du endre kolonnen til avatar_uid
.
Migrere databasen din:
rake db: migrere
Sett opp din PhotosController
med nødvendige tiltak for å laste opp et bilde. Det skal se slik ut:
# app / controllers / photos_controller.rb klasse PhotosController < ApplicationController def index @photos = Photo.all end def new @photo = Photo.new end def create @photo = Photo.new(photo_params) if @photo.save redirect_to photos_path else render :new end end private def photo_params params.require(:photo).permit(:image, :title) end end
Du må konfigurere ruter.
For nå legger du til ruter til de tre handlingene du har opprettet.
# config / routes.rb Rails.application.routes.draw do resource: bare bilder: [: index,: new,: create] root til: "bilder # index" slutten
Du må sette opp dine synspunkter som jeg har under:
# App / visninger / bilder / index.html.erbBilder
<%= notice %>
Tittel | Bilde | |||
---|---|---|---|---|
<%= photo.title %> | <%= link_to image_tag(photo.image.thumb('100x100').url), photo.image.url %> | <%= link_to 'Show', photo %> | <%= link_to 'Edit', edit_photo_path(photo) %> | <%= link_to 'Destroy', photo, method: :delete, data: confirm: 'Are you sure?' %> |
# App / visninger / bilder / new.html.erb <%= form_for @photo do |f| %><%= f.label :title %> <%= f.text_field :title %><%= f.label :image %> <%= f.file_field :image %><%= f.submit :submit %><% end %>
Vi kommer tilbake til disse visningene senere.
For sikkerhetsformål ønsker du ikke å gi brukerne rett til å laste opp filer av noe slag. Dragonfly gir deg de nødvendige metodene for dette i dine initiativer.
# config / initializers / dragonfly.rb # Legg til modellfunksjonalitet hvis definert? (ActiveRecord :: Base) ActiveRecord :: Base.extend Dragonfly :: Modell ActiveRecord :: Base.extend Dragonfly :: Modell :: Validations end
Rediger nå bildemodellen for å se ut som jeg har under:
# app / models / photo.rb klasse bilde < ActiveRecord::Base dragonfly_accessor :image #title validation validates_presence_of :title #image validations validates_presence_of :image validates_size_of :image, maximum: 400.kilobytes, message: "should not be more than 400KB", if: :image_changed? validates_property :format, of: :image, in: ['jpeg', 'png', 'gif'], message: "the formats allowed are: .jpeg, .png, .gif", if: :image_changed? end
Her er en full liste over valideringene Dragonfly tilbyr:
Klasse Photo utvide Dragonfly :: Modell :: Validasjoner validates_presence_of: image validates_size_of: image, maximum: 500.kilobytes # Sjekk filtypen validates_property: ext, of:: image, as: 'jpg' # ... eller ... validates_property: mime_type, of :: image, as: 'image / jpeg' # ... eller faktisk analysere formatet med imagemagick ... validates_property: format, av:: bilde, i: ['jpeg', 'png', 'gif'] validates_property: width :: bilde, i: (0 ... 400), melding: "é demais cara!" # ... eller du vil kanskje bruke image_changed? metode ... validates_property: format, of:: image, as: 'png', hvis:: image_changed? slutt
Du kan lese mer om det i Dragonfly-dokumentasjonen.
Du bør også vurdere å gi brukerne muligheten til å redigere sine lagrede bilder. For å gjøre dette må vi legge til to handlingsmetoder til vår PhotosController
og lag en redigeringsside i våre synspunkter. Du vil kanskje legge til slett og vis handlingen mens du er på det, som jeg har under:
# app / controllers / photos_controller.rb klasse PhotosController < ApplicationController before_action :set_photos, only: [:show, :edit, :update, :destroy] def index @photos = Photo.all end def new @photo = Photo.new end def create @photo = Photo.new(photo_params) if @photo.save redirect_to @photo else render :new end end def show end def edit end def update if @photo.update(photo_params) redirect_to @photo, notice: "photo successfully updated" else render :edit end end def destroy @photo.destroy redirect_to photos_url, notice: 'photo was successfully destroyed.' end private def photo_params params.require(:photo).permit(:image, :title) end def set_photos @photo = Photo.find(params[:id]) end end
# App / visninger / bilder / edit.html.erb <%= form_for @photo do |f| %> <% if @photo.errors.any? %><% end %><%= pluralize(@photo.errors.count, "error") %> forbyr dette bildet fra å bli lagret:
<% @photo.errors.full_messages.each do |message| %>
- <%= message %>
<% end %><%= f.label :title %> <%= f.text_field :title %><%= f.label :image %> <%= f.file_field :image %><%= f.submit :submit %><% end %> <%= link_to "Show", @photo %> | <%= link_to "Back", photos_path %>
# App / visninger / bilder / show.html.erbTittel: <%= @photo.title %>Bilde: <%= image_tag @photo.image.thumb('400x200#').url if @photo.image_stored? %><%= link_to 'Edit', edit_photo_path(@photo) %> | <%= link_to 'Back', photos_path %>
Hvis du prøver å få tilgang til showet eller redigere siden, vil du bli presentert med feil. Dette skyldes at vi begrenset ruten til : Ny,: Indeks, og: Oppdater
. Gå nå og endre det; det skal se slik ut:
# config / routes.rb Rails.application.routes.draw gjør ressurser: bilder rot til: "bilder # index" slutten
På dette punktet kan du nå integrere Dragonfly i din Rails-applikasjon. Pass på å sjekke ut dokumentasjonen hvis du vil prøve flere funksjoner som ikke er nevnt her. jeg håper du likte det.
Husk at du alltid kan legge til tilbakemelding, spørsmål og kommentarer i skjemaet nedenfor.