2017-11-13 3 views
1

Ich kann meine Bilder nicht mit Schrein, im Gegensatz zu Carrierwave die unten Code funktioniert nicht.Wie säen Bilder mit Schrein

Profile.create! id: 2, 
       user_id: 2, 
       brand: "The Revengers", 
       location: "Azgaurd", 
       phone_number: "send a raven", 
       image_data: File.open(Rails.root+"app/assets/images/seed/thor.png") 

Ich habe auch versucht

image_data: ImageUploader.new(:store).upload(File.open(Rails.root+"app/assets/images/seed/thor.png")) 

aber es gibt

JSON::ParserError in Profiles#show 
743: unexpected token at '#<ImageUploader::UploadedFile:0x007fd8bc3142e0>' 

Gibt es einen Schrein Art und Weise? Ich kann es nirgends finden.

shrine.rb

require "cloudinary" 
require "shrine/storage/cloudinary" 


Cloudinary.config(
    cloud_name: ENV['CLOUD_NAME'], 
    api_key:ENV['API_KEY'], 
    api_secret:ENV['API_SECRET'], 
) 

Shrine.storages = { 
    cache: Shrine::Storage::Cloudinary.new(prefix: "cache"), # for direct 
uploads 
    store: Shrine::Storage::Cloudinary.new(prefix: "store"), 
} 

profile.rb

class Profile < ApplicationRecord 
    include ImageUploader[:image] 
    belongs_to :user 
    has_and_belongs_to_many :genres 
    scoped_search on: [:brand] 
end 

image_uploader.rb

class ImageUploader < Shrine 
end 
+0

Bitte teilen 'Profile' Klassendefinition zusammen mit Shrine initializer und der' ImageUploader.rb ' –

+0

Okay, ich habe die zusätzlichen Informationen oben hinzugefügt. –

+0

erhalten Sie irgendwelche Fehlermeldungen, wenn Sie den Befehl ausführen? –

Antwort

2

Verwendung Shrine, das Befestigungsattribut (zB image_data) auf dem Modell (zB Profile) ist eine Textspalte in der Datenbank (Sie können defi es als json oder jsonb auch). Jetzt sollte klar sein, dass diese Spalte kein File Objekt akzeptieren kann (was Sie versuchen).

Zuerst müssen Sie einen Uploader verwenden (zB ImageUploader) die Zieldatei in einem Ihrer konfigurierten Schrein Speicher (zB :cache oder :store) hochladen:

uploader = ImageUploader.new(:store) 
file = File.new(Rails.root.join('app/assets/images/seed/thor.png')) 
uploaded_file = uploader.upload(file) 

Hier ist die wichtigste Methode des Uploaders ist #upload , die ein IO-ähnliches Objekt auf die Eingabe nimmt und eine Repräsentation der hochgeladenen Datei (ImageUploader::UploadedFile) an die Ausgabe zurückgibt.

An dieser Stelle haben Sie die hochgeladene Datei in der Hand. Nun das Modell (Profile) nur brauchen die json Darstellung der hochgeladenen Datei in seiner Befestigungsattributspalte (image_data) wie folgt:

Profile.create! id: 2, 
       user_id: 2, 
       brand: "The Revengers", 
       location: "Azgaurd", 
       phone_number: "send a raven", 
       image_data: uploaded_file.to_json 
+1

Funktioniert! Schön! –

Verwandte Themen