Ich bin neu in Rails und schreibe eine RESTful-Website mit der CRUD-Technik. Bisher habe ich drei Seiten erstellt, auf denen der Benutzer eine Zeile erstellen, bearbeiten und aus der Datenbank löschen kann. Meine vierte Seite muss jedoch ein Upload-Dateiformat enthalten. A) Ich weiß nicht, wie das Dateisystem mit Rails funktioniert, daher weiß ich nicht, wo Dateien gespeichert werden sollen. Die Datei würde ungefähr 100 KB groß sein und könnte nicht im temporären Speicher gespeichert werden, da sie ständig heruntergeladen wird. Und b) Ich weiß nicht, wie ich in eine Datei schreiben soll.
Es wäre großartig, wenn Sie mir sagen könnten, wie ich das oben erwähnte tun soll - eine Upload-Eingabe in einem Eingabeformular erstellen und die Datei dann in einen Dateipfad in einem separaten Verzeichnis schreiben.
File.open
( ruby-doc.org/core-1.9.3/File.html#method-c-open ).wb
anstatt nurw
, da sonst der Upload für Dateien mit Nicht-ASCII-Zeichen fehlschlagen kann.new
Controller-Methode?September 2018
Für alle, die diese Frage kürzlich überprüft haben, verfügt Rails 5.2+ jetzt standardmäßig über ActiveStorage. Ich empfehle dringend, sie zu überprüfen.
Da es jetzt Teil der Core Rails 5.2+ ist, ist es sehr gut integriert und verfügt über hervorragende Funktionen (alle anderen bekannten Edelsteine wie Carrierwave, Shrine, Büroklammer, ... sind großartig, aber dieses bietet sehr viel gute Funktionen, die wir für jedes neue Rails-Projekt berücksichtigen können)
Das Büroklammer-Team hat das Juwel zugunsten des Rails ActiveStorage abgelehnt.
Hier ist die Github-Seite für ActiveStorage und überall stehen zahlreiche Ressourcen zur Verfügung
Außerdem fand ich dieses Video sehr hilfreich, um die Funktionen von Activestorage zu verstehen
quelle
Besonders zum Hochladen von Dateien gibt es ein schönes Juwel: Carrierwave . Wenn das Wiki nicht hilft, gibt es eine nette RailsCast über die beste Art, es zu benutzen. Zusammenfassend gibt es
file
in Rails-Formularen einen Feldtyp, der den Dialog zum Hochladen von Dateien aufruft. Sie können es verwenden, aber die "Magie" wird voncarrierwave
Edelstein ausgeführt.Ich weiß nicht, was Sie mit "wie man in eine Datei schreibt" meinen, aber ich hoffe, dass dies ein guter Anfang ist.
quelle
In Ordnung. Wenn Sie die Datei nicht in der Datenbank und in der Anwendung speichern möchten, wie z. B. Assets (benutzerdefinierter Ordner), können Sie eine von attr_accessor: document definierte Nicht-DB-Instanzvariable definieren und zum Abrufen
form_for - f.file_field
der Datei verwenden.In der Steuerung,
Hier
person_params
kehren Sie auf die Whitelist zurückparams[:person]
(definieren Sie sich selbst)Datei speichern als,
dir = "#{Rails.root}/app/assets/custom_path" FileUtils.mkdir(dir) unless File.directory? dir document = @person.document.document_file_name # check document uploaded params File.copy_stream(@font.document, "#{dir}/#{document}")
Hinweis: Fügen Sie diesen Pfad in
.gitignore
& hinzu, wenn Sie diese Datei erneut verwenden möchten, und fügen Sie diesen Pfadasset_path
der Anwendung von hinzuapplication.rb
Jedes Mal, wenn ein Formular eine Datei liest, wird es im tmp-Ordner gespeichert. Später können Sie es bei Ihnen speichern. Ich habe ein Beispiel für das Speichern in Assets gegeben
Hinweis : Durch das Speichern solcher Dateien wird die Größe der Anwendung erhöht und besser in der Datenbank gespeichert
paperclip
.quelle
In Ihrem Intiallizer / Carrierwave.rb
if Rails.env.development? || Rails.env.test? config.storage = :file config.root = "#{Rails.root}/public" if Rails.env.test? CarrierWave.configure do |config| config.storage = :file config.enable_processing = false end end end
Verwenden Sie diese Option, um sie in einer Datei zu speichern, während sie lokal ausgeführt wird
quelle