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.
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'
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
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), :html => multipart:: true) do | f | %> <%= devise_error_messages! %>
<%= f.label :email %><% end %>
<%= render “devise/shared/links” %>"
Doe hetzelfde voor app / views / bedenken / registraties / edit.html.erb
:
"rails app / views / bedenken / registraties / edit.html.erb
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: method: :put, multipart: :true ) do |f| %> <%= devise_error_messages! %>
<%= f.label :email %><% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<% 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)<% end %>
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
.
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
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.
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
.
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.
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.