codering utf-8

In het eerste deel van deze serie leerde je CarrierWave gebruiken in je Rails-applicatie. In dit tweede deel leert u hoe u afbeeldingen kunt uploaden voor uw gebruikers met behulp van Devise. Devise is een authenticatieoplossing voor Rails. U leert ook hoe u mist gebruikt, een Ruby cloudservicebibliotheek die uw toepassing in staat stelt verbinding te maken met Amazon Web Services.

Genoeg gepraat, laten we het doen.

Rails applicatie-instellingen

Genereer uw nieuwe rails-applicatie:

rails rails nieuwe myapp

Open je Gemfile en voeg de volgende edelstenen toe:

"rails Gemfile

edelsteen bedeltje edelsteen bedel mini_magick gem mist "

Rennen bundel installeren om de edelstenen te installeren.

Maak vanaf uw terminal een Pages-controller:

rails rails g controller Pagina's index

Navigeren naar config / routes.rb en voeg een root-pad toe:

"rails config / routes.rb

root naar: 'pages # index'

Genereer en configureer Devise

De uploadfunctie zal in ons gebruikersmodel worden geïntegreerd zodat gebruikers avatars kunnen uploaden. Installeer vanaf uw terminal:

rails rails genereren bedenken: installeren

De generator installeert een initializer die beschrijft allemaal van de configuratie-opties van Devise. Doe open app / views / layouts / application.html.erb in je teksteditor en voeg de volgende code toe boven de opbrengst blok:

"rails app / views / layouts / application.html.erb

<%= notice %>

<%= alert %>

"

Op dit punt kunt u uw gebruikersmodel genereren:

rails rails genereren bedenken Gebruiker

Migreer vervolgens uw database:

rails hark db: migreren

U moet ontwerpvisies bewerken, dus het is belangrijk dat u deze genereert:

rails rails genereren bedenken: uitzichten

En dat zal de magie doen.

Gebruik je teksteditor om te openen app / views / bedenken / registraties / new.html.erb en bewerk het om er zo uit te zien:

"rails app / views / bedenken / registraties / new.html.erb

Inschrijven

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), :html => multipart:: true) do | f | %> <%= devise_error_messages! %>

<%= f.label :email %>
<%= f.email_field :email, autofocus: true %> <%= f.label :password %> <% if @minimum_password_length %> (<%= @minimum_password_length %> tekens minimum) <% end %>
<%= f.password_field :password, autocomplete: "off" %> <%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %> <%= f.label :avatar do %> <%= f.file_field :avatar %> <%= f.hidden_field :avatar_cache %> <% end %> <%= f.submit "Sign up" %>

<% end %>

<%= render “devise/shared/links” %>"

Doe hetzelfde voor app / views / bedenken / registraties / edit.html.erb:

"rails app / views / bedenken / registraties / edit.html.erb

Bewerk <%= resource_name.to_s.humanize %>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: method: :put, multipart: :true ) do |f| %> <%= devise_error_messages! %>

<%= f.label :email %>
<%= f.email_field :email, autofocus: true %>

<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>

Momenteel wachtende bevestiging voor: <%= resource.unconfirmed_email %>
<% end %>

<%= f.label :password %> (laat leeg als u dit niet wilt wijzigen)
<%= f.password_field :password, autocomplete: "off" %> <%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %>

<% if current_user.avatar.url.present? %> <%= image_tag(current_user.avatar.url) %> <%= f.label :remove_avatar do %> <%= f.check_box :remove_avatar %> <% end %> <% end %> <%= f.file_field :avatar %> <%= f.hidden_field :avatar_cache %>

<%= f.label :current_password %> (we hebben je huidige wachtwoord nodig om je wijzigingen te bevestigen)
<%= f.password_field :current_password, autocomplete: "off" %> <%= f.submit "Update" %>

<% end %>

Annuleer mijn account

Ongelukkig? <%= button_to "Cancel my account", registration_path(resource_name), data: confirm: "Are you sure?" , method: :delete %>

<%= link_to “Back”, :back %>"

Als dat is gebeurd, moet je de avatar op de witte lijst zetten en een avatarkolom aan de gebruikerstabel toevoegen. Vanaf uw terminal voert u migratie uit om een ​​nieuwe avatarkolom toe te voegen.

"rails

rails g migratie add_avatar_to_users avatar: string rake db: migrate "

Voeg de CarrierWave-avatar toe aan uw gebruikersmodel; uw model zou er als volgt uit moeten zien:

"rails modellen / user.rb

klasse Gebruiker < ActiveRecord::Base mount_uploader :avatar, AvatarUploader

bedenken: database_authentiseerbaar,: registereerbaar,: herstelbaar,: onthoudbaar,: traceerbaar,: valideerbaar

# User Avatar Validation validates_integrity_of: avatar validates_processing_of: avatar

private def avatar_size_validation errors [: avatar] "" moet kleiner zijn dan 500 KB "als avatar.size> 0,5.megabytes einde"

In de bovenstaande code heb je een toegevoegd mount_uploader regel bovenaan Gebruiker klasse. Er is ook een validatie om de integriteit en verwerking van de avatar te controleren, naast een methode om ervoor te zorgen dat geen afbeelding groter dan 500 KB wordt geüpload.

U moet toevoegen avatar, avatar_cache, en remove_avatar naar de lijst met toegankelijke attributen. Dit doen is gemakkelijk - open gewoon je application_controller.rb en laat het er zo uitzien:

"rails app / controllers / application_controller.rb

class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception

before_action: configure_permitted_parameters, if:: devise_controller?

beschermde

def configure_permitted_parameters devise_parameter_sanitizer.for (: sign_up) | u | u.permit (: gebruikersnaam,: email,: wachtwoord,: password_confirmation,: remember_me,: avatar,: avatar_cache) devise_parameter_sanitizer.for (: account_update) | u | u.permit (: gebruikersnaam,: wachtwoord,: password_confirmation,: current_password,: avatar,: avatar_cache,: remove_avatar) end end "

Met dat klaar, bent u klaar om te integreren CarrierWave.

CarrierWave instellen

Ga met behulp van uw teksteditor naar config / initialiseerders en maak een bestand met de naam carrier_wave.rb. Plak in de onderstaande code:

rails *** config / initializers / carrier_wave.rb ***

rails vereisen 'carrierwave / orm / activerecord'

Dit is de initializer die nodig is bij het laden van CarrierWave na ActiveRecord.

Genereer vanuit uw terminal een uploader:

rails rails genereren uploader Avatar

Hiermee wordt een nieuwe map gemaakt met de naam uploaders in de app-map en een bestand binnen genaamd avatar_uploader.rb. Ik heb de inhoud van het bestand bewerkt om eruit te zien als wat ik hieronder heb:

"rails

app / uploaders / avatar_uploader.rb

codering: utf-8

klas AvatarUploader < CarrierWave::Uploader::Base

omvatten CarrierWave :: MiniMagick

# Kies wat voor soort opslagruimte je wilt gebruiken voor deze uploader: opslag: mist

# Negeer de map waar geüploade bestanden worden opgeslagen. # Dit is een verstandige standaard voor uploaders die moeten worden gemount: def store_dir "uploads / # model.class.to_s.underscore / # mounted_as / # model.id" einde

# Maak verschillende versies van uw geüploade bestanden: versie: thumb do proces: resize_to_fill => [100, 100] einde

versie: medium doe proces: resize_to_fill => [300, 300] einde

versie: small do process: resize_to_fill => [140, 140] einde

# Voeg een witte lijst met extensies toe die mogen worden geüpload. # Voor afbeeldingen kunt u zoiets als dit gebruiken: def extension_white_list% w (jpg jpeg gif png) end end "

Je hebt de MiniMagick regel om verschillende versies van een afbeelding te genereren. Ik heb drie versies van afbeeldingen bijgevoegd. MiniMagick maakt het wijzigen van de grootte in deze versie mogelijk. Het laatste codeblok zorgt ervoor dat geen enkele bestandsextensie wordt geüpload van degene die hier worden vermeld.

AWS Setup

Voor deze zelfstudie zullen we onze afbeeldingen uploaden naar Amazon Web Services. Als je nog geen account hebt, ga je naar de aanmeldingspagina en maak je een gratis account aan.

Als je hiermee klaar bent, moet je een bucket maken om je afbeeldingen op te slaan. Wanneer kies je daar voor Maak een bucket om het dialoogvenster te openen. Voer een naam in voor de bucket en selecteer een regio. Wanneer u klaar bent, selecteert u creëren.

Open je Gemfile en voeg dit juweeltje toe, en bundel installeren wanneer klaar.

rails gem 'figaro'

Vanaf je terminal, rennen bundel exec figaro install. Dit zal een nieuw bestand maken config / application.yml en voeg het toe aan je applicaties .gitignore. U hebt dit bestand nodig om uw AWS-toegangs-ID en geheime sleutel veilig te houden.

Om uw AWS-toegangs-ID en geheime sleutel te vinden, gaat u naar Amazon Web Services en klikt u op de naam van uw account, die zich in de rechterhoek van de console bevindt.

Selecteer in de vervolgkeuzelijst Beveiligingslegitimatie, en klik op de Doorgaan naar beveiligingsreferenties knop. Selecteer op de pagina die wordt weergegeven Toegangssleutels (Access Key ID en Secret Access Key). Klik op de Maak een nieuwe toegangssleutel om een ​​nieuwe sleutel te genereren en deze naar een editor te kopiëren.

Ga in de teksteditor naar config / application.yml en plak in het volgende:

"rails config / application.yml

aws_access_id: Voer hier toegang_id in aws_access_secret_key: Voer hier de toegangssleutel in "

Vervang de lijnen zoals hierboven vermeld.

Navigeren naar config / initialiseerders, maak een bestand met de naam storage.rb, en plak in het volgende:

"rails config / initialiseerders / storage.rb

CarrierWave.configuratie do | config | config.storage =: mist config.fog_credentials = provider: 'AWS', aws_access_key_id: ENV ["aws_access_id"], aws_secret_access_key: ENV ["aws_access_secret_key"], region: 'us-west-2' config.fog_directory = " tutsplus-avatar "config.fog_public = false end"

Volgens de bovenstaande configuratie is de regio voor mijn bucket us-west-2, en de naam van de emmer is tutsplus-avatar. Vervang dat door informatie over uw bucket.

Start uw rails server en wijs je browser aan http: // localhost: 3000 / users / sign_up.

Een standaard avatar instellen

In uw toepassing kunt u een standaardavatar instellen voor gebruikers die ervoor kiezen geen avatar te uploaden. Dit doen is gemakkelijk.

Maak een map in app / assets / images riep terugvallen en zet daar je standaard afbeelding in. Ga met behulp van uw teksteditor naar app / uploaders / avatar_uploader.rb en plak in de onderstaande code:

"rails app / uploaders / avatar_uploader.rb

def default_url (* args) ActionController :: Base.helpers.asset_path ("fallback /" + [version_name, "default-avatar.gif"]. compact.join ('_')) einde "

Zorg dat je verandert default-avatar.gif naar de naam van je afbeelding.

Conclusie

Nu weet u hoe u het uploaden van afbeeldingen voor uw gebruikers kunt inschakelen. Dit voegt een belangrijke functie toe aan uw rails-applicatie. Ik hoop dat je het leuk had. In het volgende deel zullen we PaperClip bekijken. Uw feedback is welkom.