Ruby on Rails
Filuppladdningar
Sök…
Uppladdning av en fil med Carrierwave
Börja använda File Uploads in Rails är ganska enkelt, det första du måste göra är att välja plugin för att hantera uppladdningar. De vanligaste krafterna är Carrierwave och Paperclip . Båda har liknande funktionalitet och är rik på dokumentation om
Låt oss ta en titt på exempel med enkel avataruppladdningsbild med Carrierwave
Skriv bundle install
Carrierwave
$ rails generate uploader ProfileUploader
Detta skapar en konfigurationsfil som finns på /app/uploaders/profile_uploader.rb
Här kan du ställa in lagring (dvs lokalt eller moln), tillämpa tillägg för bildmanipulationer (dvs. skapa tummar via MiniMagick) och ställa in vitlista på serverns förlängning
Skapa sedan ny migrering med strängtyp för user_pic och montera uppladdare för den i user.rb- modellen.
mount_uploader :user_pic, ProfileUploader
Visa sedan ett formulär för att ladda upp avatar (kan vara en redigeringsvy för användaren)
<% form_for @user, html: { multipart: true } do |f| %>
<%= f.file_field :user_pic, accept: 'image/png, image/jpg' %>
<%= f.submit "update profile pic", class: "btn" %>
<% end %>
Se till att inkludera {multipart: true} i ordningsformuläret kan behandla uppladdningar. Accept är ett valfritt för att ställa in vitlista på klientsidan-förlängningen.
För att visa en avatar, helt enkelt göra
<%= image_tag @user.user_pic.url %>
Kapslad modell - flera uppladdningar
Om du vill skapa flera uppladdningar är det första du kanske vill göra en ny modell och skapa relationer
Låt oss säga att du vill ha flera bilder för produktmodellen. Skapa en ny modell och gör att den belongs_to
din belongs_to
rails g model ProductPhoto
#product.rb
has_many :product_photos, dependent: :destroy
accepts_nested_attributes_for :product_photos
#product_photo.rb
belongs_to :product
mount_uploader :image_url, ProductPhotoUploader # make sure to include uploader (Carrierwave example)
accepts_nested_attribut_for är måste, eftersom det tillåter oss att skapa kapslad form, så vi kan ladda upp ny fil, ändra produktnamn och fastställa pris från en enda form
Skapa sedan form i en vy (redigera / skapa)
<%= form_for @product, html: { multipart: true } do |product|%>
<%= product.text_field :price # just normal type of field %>
<%= product.fields_for :product_photos do |photo| # nested fields %>
<%= photo.file_field :image, :multiple => true, name: "product_photos[image_url][]" %>
<% end %>
<%= p.submit "Update", class: "btn" %>
<% end %>
Controller är inget speciellt, om du inte vill skapa en ny, bara skapa en ny inuti din produktkontroller
# create an action
def upload_file
printer = Product.find_by_id(params[:id])
@product_photo = printer.prodcut_photos.create(photo_params)
end
# strong params
private
def photo_params
params.require(:product_photos).permit(:image)
end
Visa alla bilder i en vy
<% @product.product_photos.each do |i| %>
<%= image_tag i.image.url, class: 'img-rounded' %>
<% end %>