I de två första delarna i denna serie visade jag dig hur du aktiverar bilduppladdning i Rails med CarrierWave. I den här delen ser du hur du gör det med Paperclip.
Paperclip är en Ruby pärla som tillhandahålls av thoughtbot. Det skapades för att göra bifogade filer mycket enkelt. I den här handledningen ser du hur du använder Paperclip vid sidan av Devise.
Utan mycket samtal, låt oss bli upptagna.
Paperclip kräver installation av ImageMagick på din maskin. Du behöver detta för bildbehandling. För att installera ImageMagick, använd något av stegen nedan, beroende på vilken typ av maskin du använder.
Mac-användare:
brygga installera imagemagick
Ubuntu-användare:
sudo apt-get install imagemagick
Använd din terminal för att skapa en ny applikation.
skenar ny pappersklip
Öppna din Gemfile och lägg till de nödvändiga ädelstenarna:
pärla "paperclip"
pärla "tänka"
Kör buntinstallation när du är klar.
Från din terminal, installera konstruera med kommandot nedan:
skenor generera utforma: installera
När det är klart kan du nu generera din användarmodell:
skenor genererar utforma användaren
Migrera din databas efter.
rake db: migrera
Generera dina tänkbara åsikter.
skenor generera utforma: vyer
Använd din textredigerare, navigera till app / vyer / layouter / application.html.erb
och lägg till följande kod strax ovanför avkastning
blockera.
# App / views / layouter / application.html.erb<%= notice %>
<%= alert %>
På grund av säkerhetsskäl måste vi tillåta parametrar i Devise-kontrollen. Tack vare det fantastiska laget bakom Devise gör det här lätt.
Öppna app / controllers / application_controller.rb
och klistra in i följande rader av kod.
# app / controllers / application_controller.rb klass 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? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me, :avatar, :avatar_cache) devise_parameter_sanitizer.for(:account_update) |u| u.permit(:username, :password, :password_confirmation, :current_password, :avatar) end end
Öppna din Användare
modell och få det att se ut så här:
# app / models / user.rb klass användare < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_attached_file :avatar, styles: medium: "300x300", thumb: "100x100" validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/ end
Du måste lägga till en avatar
kolumnen till din Användar-tabell. Det finns ett rails-kommando som gör det möjligt från din terminal.
rails generera migrering add_avatar_to_users
Det kommer att skapa en ny migrering i db / migrera
. Öppna den och klistra in underkoden:
klass AddAvatarToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down remove_attachment :users, :avatar end end
Kör din migrering
rake db: migrera
Du kommer att redigera din nya registreringsform app / views / utforma / registreringar / new.html.erb
och redigera formuläret app / views / utforma / registreringar / edit.html.erb
till vad jag har nedan:
# App / views / utforma / registreringar / new.html.erbBli Medlem
<%= 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 %> tecken minimum) <% end %>
<%= f.password_field :password, autocomplete: "off" %><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %><%= f.file_field :avatar %><%= f.submit "Sign up" %><% end %> <%= render "devise/shared/links" %>
# App / views / utforma / registreringar / edit.html.erbRedigera <%= resource_name.to_s.humanize %>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: method: :put ) do |f| %> <%= devise_error_messages! %><%= f.label :email %><% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<%= f.email_field :email, autofocus: true %>För närvarande väntar bekräftelse på: <%= resource.unconfirmed_email %><% end %><%= f.label :password %> (lämna tomt om du inte vill ändra det)
<%= f.password_field :password, autocomplete: "off" %><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %><%= f.file_field :avatar %><%= f.label :current_password %> (vi behöver ditt nuvarande lösenord för att bekräfta dina ändringar)
<%= f.password_field :current_password, autocomplete: "off" %><%= f.submit "Update" %><% end %>Avbryt mitt konto
Olycklig? <%= button_to "Cancel my account", registration_path(resource_name), data: confirm: "Are you sure?" , method: :delete %>
<%= link_to "Back", :back %>
Kick av din webbläsare och kolla vad du har.
För en vanlig applikation kanske du vill kontrollera om en användare som vill redigera sin profil redan har en avatar uppladdad. Detta är enkelt att implementera i din registreringsredigeringsfil.
Öppna registreringsredigeringsfilen och se till att den ser ut så här:
# App / views / utforma / registreringar / edit.html.erbRedigera <%= resource_name.to_s.humanize %>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: method: :put ) do |f| %> <%= devise_error_messages! %><%= f.label :email %><% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<%= f.email_field :email, autofocus: true %>För närvarande väntar bekräftelse på: <%= resource.unconfirmed_email %><% end %><%= f.label :password %> (lämna tomt om du inte vill ändra det)
<%= f.password_field :password, autocomplete: "off" %><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %><%= f.file_field :avatar %> <% if @user.avatar? %> <%= image_tag @user.avatar.url(:thumb) %> <% end %><%= f.label :current_password %> (vi behöver ditt nuvarande lösenord för att bekräfta dina ändringar)
<%= f.password_field :current_password, autocomplete: "off" %><%= f.submit "Update" %><% end %>Avbryt mitt konto
Olycklig? <%= button_to "Cancel my account", registration_path(resource_name), data: confirm: "Are you sure?" , method: :delete %>
<%= link_to "Back", :back %>
Kan du se vad som ändrats?
I ovanstående kod finns ett villkorligt uttalande för att kontrollera om en avatar redan finns för en användare som använder linjen <% if @user.avatar? %>
. Om detta returneras sant får nästa raden springa, annars gör det inte.
Valideringen är alltid viktig när du kan ladda upp funktioner i din webbapplikation. Paperclip kommer med åtgärder för att säkra din ansökan.
Du kan använda någon av valideringarna nedan i din modell.
klass användare < ActiveRecord::Base has_attached_file :avatar # Validate content type validates_attachment_content_type :avatar, content_type: /\Aimage/ # Validate filename validates_attachment_file_name :avatar, matches: [/png\Z/, /jpe?g\Z/] # Explicitly do not validate do_not_validate_attachment_file_type :avatar end
Du kanske vill överväga Paperclip när du bygger din nästa webbapplikation. Den har ett bra lag som stöder det.
För att utforska andra funktioner som inte omfattas av denna handledning, kolla Paperclips GitHub-sida.