Rails Bildöverföring Använda Paperclip i en Rails-applikation

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

Rails Application Generation

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.

Avinstallera inställningen

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 %>

Paperclip Integration

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

Lägg till Avatar för att formulera formulär

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.erb 

Bli 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.erb 

Redigera <%= 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 %>
<%= f.email_field :email, autofocus: true %>
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
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.erb 

Redigera <%= 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 %>
<%= f.email_field :email, autofocus: true %>
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
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.

Säkerhetsvalideringar

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

Slutsats

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.