So legen Sie einen Datei-Upload programmgesteuert mit Paperclip fest

68

Ich habe eine Rechenaufgabe, um eine Anwendung mit zufälligen Daten unter Verwendung des Fälscheredelsteins zu erstellen. Wir haben jedoch auch Bilder (wie Logos), die wir in dieser Rechenaufgabe hochladen möchten.

Wir haben bereits eine Büroklammer eingerichtet, können sie jedoch nicht programmgesteuert in eine Rechenaufgabe hochladen. Irgendwelche Ideen?

Jaryl
quelle

Antworten:

144

Was meinst du mit programmatisch? Sie können eine Methode einrichten, die einen Dateipfad nach dem Vorbild von verwendet

my_model_instance = MyModel.new
file = File.open(file_path)
my_model_instance.attachment = file
file.close
my_model_instance.save!

#attachmentstammt aus unserer Büroklammererklärung in unserem Modell. In diesem Fall sieht unser Modell so aus

class MyModel < ActiveRecord::Base
  has_attached_file :attachment
end

Wir haben ähnliche Dinge getan, als wir ein Projekt gebootet haben.

theIV
quelle
5
attachmentist was auch immer Sie eingestellt habenhas_attached_file :attachment,
B Sieben
1
@BSeven denkst du, es wäre klarer, wenn ich das der Antwort hinzufügen würde? Wenn ja, werde ich es hinzufügen.
theIV
Ja. Es ist nicht klar, ob attachmentein reserviertes Wort oder ein Benutzer definiert ist.
B Sieben
2
Bitte hör auf, offene Dateien zu predigen und vergiss, dass es in der Ruby-Community so eine böse Sache ist. Öffnen und dann Schließen oder Verwenden eines Blocks.
Clyfe
2
@clyfe Sie sind herzlich eingeladen, den Beitrag zu bearbeiten. Wenn nicht, welche der beiden Methoden ( #closeoder Blöcke) bevorzugen Sie? Auch das Predigen ist ein bisschen stark, oder? Ihr Punkt wird jedoch gut aufgenommen.
theIV
12

Ich mache so etwas in einer Rechenaufgabe.

photo_path = './test/fixtures/files/*.jpg'
Dir.glob(photo_path).entries.each do |e|
  model = Model.find(<query here>)        
  model.attachment = File.open(e)
  model.save
end

Ich hoffe das hilft!

jonnii
quelle
Das ist nützlich, aber ich denke, wir machen das nicht genau, trotzdem danke!
Jaryl
8

Ich musste dafür eigentlich keine Methode schreiben. Viel einfacher.

Im Modell ->

Class Model_Name < ActiveRecord::Base
  has_attached_file :my_attachment,
  :params_for_attachment

In seed.db ->

my_instance = Model_name.new
my_instance.my_attachment = File.open('path/to/file/relative/to/app')
my_instance.save!

Möglicherweise sollten die vorherigen Antworten den im Modell definierten Namen des Anhangs verwenden (anstatt eine Methode Model_name.attachment zu schreiben). Hoffe das ist klar.

winfred
quelle
oder in einer Zeilemy_instance = Model_name.create!(my_attachment: File.open('path/to/file/relative/to/app'))
scarver2
Aus irgendeinem Grund konnte ich die Multiline nicht zum Laufen bringen, aber die von Scarver2 war eine Wohltat
Ben