Rails-Bild-Upload Verwenden einer Büroklammer in einer Rails-Anwendung

In den ersten beiden Teilen dieser Serie habe ich Ihnen gezeigt, wie Sie das Hochladen von Bildern in Rails mithilfe von CarrierWave aktivieren. In diesem Teil erfahren Sie, wie Sie dies mit Paperclip tun.

Paperclip ist ein Ruby-Edelstein, der von thoughtbot bereitgestellt wird. Es wurde erstellt, um Dateianhänge sehr einfach zu gestalten. In diesem Tutorial erfahren Sie, wie Sie Paperclip neben Devise verwenden.

Ohne viel zu reden, lass uns arbeiten.

Paperclip erfordert die Installation von ImageMagick auf Ihrem Computer. Sie benötigen dies zur Bildverarbeitung. Führen Sie zur Installation von ImageMagick je nach verwendetem Gerätetyp einen der folgenden Schritte aus.

Mac-Benutzer:

brauen installieren imagemagick

Ubuntu-Benutzer:

sudo apt-get install imagemagick

Rails-Anwendungsgenerierung

Verwenden Sie Ihr Terminal, um eine neue Anwendung zu generieren.

Schienen neue Büroklammer

Öffne dein Gemfile und füge die notwendigen Edelsteine ​​hinzu:

Juwel 'Büroklammer'

Juwel 'erfinden'

Führen Sie die Bundle-Installation aus, wenn Sie fertig sind.

Setup einrichten

Installieren Sie von Ihrem Terminal aus den folgenden Befehl:

Schienen erzeugen Gerät: Installieren

Anschließend können Sie Ihr Benutzermodell generieren:

Schienen generieren den Benutzer

Migrieren Sie Ihre Datenbank danach.

rake db: migrieren

Generieren Sie Ihre Ansichten.

Schienen generieren: Ansichten

Navigieren Sie mit Ihrem Texteditor zu app / views / layouts / application.html.erb und fügen Sie den folgenden Code direkt über dem ein Ausbeute Block.

# app / views / layouts / application.html.erb 

<%= notice %>

<%= alert %>

Büroklammer-Integration

Aus Sicherheitsgründen müssen wir Parameter im Devise-Controller zulassen. Dank des großartigen Teams von Devise ist das ganz einfach.

Aufmachen app / controller / application_controller.rb und fügen Sie die folgenden Codezeilen ein.

# app / controller / application_controller.rb-Klasse 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 

Öffne deine Nutzer modellieren und so aussehen lassen:

# app / models / user.rb-Klasse Benutzer < 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

Sie müssen ein hinzufügen Benutzerbild Spalte in Ihre Benutzertabelle. Es gibt einen Rails-Befehl, der dies von Ihrem Terminal aus ermöglicht.

Schienen generieren die Migration add_avatar_to_users

Dadurch wird eine neue Migration in erstellt db / migrieren. Öffnen Sie es und fügen Sie den folgenden Code ein:

Klasse AddAvatarToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down remove_attachment :users, :avatar end end

Führen Sie die Migration aus

rake db: migrieren

Avatar zu Devise Forms hinzufügen

Sie bearbeiten Ihr neues Anmeldeformular app / views / devise / registrations / new.html.erb und bearbeiten Sie das Formular app / views / devise / registrations / edit.html.erb was ich unten habe:

# app / views / devise / registrations / new.html.erb 

Anmelden

<%= 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 %> Zeichen mindestens) <% 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 / devise / registrations / edit.html.erb 

Bearbeiten <%= 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? %>
Warten auf Bestätigung für: <%= resource.unconfirmed_email %>
<% end %>
<%= f.label :password %> (lassen Sie das Feld leer, wenn Sie es nicht ändern möchten)
<%= 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 %> (Wir benötigen Ihr aktuelles Passwort, um Ihre Änderungen zu bestätigen.)
<%= f.password_field :current_password, autocomplete: "off" %>
<%= f.submit "Update" %>
<% end %>

Kündigen Sie mein Konto

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

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

Starten Sie Ihren Browser und prüfen Sie, was Sie haben.

Für eine Standardanwendung möchten Sie möglicherweise prüfen, ob ein Benutzer, der sein Profil bearbeiten möchte, bereits einen Avatar hochgeladen hat. Dies lässt sich leicht in Ihre Registrierungsbearbeitungsdatei implementieren.

Öffnen Sie die Registrierungs-Bearbeitungsdatei und machen Sie sie so:

# app / views / devise / registrations / edit.html.erb 

Bearbeiten <%= 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? %>
Warten auf Bestätigung für: <%= resource.unconfirmed_email %>
<% end %>
<%= f.label :password %> (lassen Sie das Feld leer, wenn Sie es nicht ändern möchten)
<%= 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 %> (Wir benötigen Ihr aktuelles Passwort, um Ihre Änderungen zu bestätigen.)
<%= f.password_field :current_password, autocomplete: "off" %>
<%= f.submit "Update" %>
<% end %>

Kündigen Sie mein Konto

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

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

Kannst du sehen, was sich geändert hat??

Im obigen Code gibt es eine bedingte Anweisung, um zu überprüfen, ob für einen Benutzer, der die Zeile verwendet, bereits ein Avatar vorhanden ist <% if @user.avatar? %>. Wenn dies true zurückgibt, wird die nächste Zeile ausgeführt, sonst nicht.

Sicherheitsüberprüfungen

Die Validierung ist immer wichtig, wenn Sie die Upload-Funktionen in Ihrer Webanwendung aktivieren. Büroklammer enthält Maßnahmen zur Absicherung Ihrer Bewerbung.

Sie können eine der folgenden Validierungen in Ihrem Modell verwenden.

Klasse Benutzer < 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

Fazit

Möglicherweise möchten Sie Paperclip beim Erstellen Ihrer nächsten Webanwendung berücksichtigen. Es hat ein tolles Team, das es unterstützt.

Auf der GitHub-Seite von Paperclip finden Sie weitere Funktionen, die nicht in diesem Tutorial behandelt werden.