Wgrywanie pliku do Railsów


Jestem nowy w railsach i piszę witrynę RESTful przy użyciu techniki CRUD. Do tej pory stworzyłem trzy strony, z których każda umożliwia użytkownikowi tworzenie, edycję i usuwanie wiersza z bazy danych. Jednak moja czwarta strona będzie musiała zawierać formularz przesyłania plików, ale a) Nie wiem, jak działa system plików z Railsami, więc nie wiem, gdzie powinny być przechowywane pliki. Plik będzie miał około 100 KB i nie można go zapisać w pamięci tymczasowej, ponieważ będzie stale pobierany. I b) nie wiem, jak pisać do pliku.
Byłoby wspaniale, gdybyś mógł mi powiedzieć, jak zrobić to, o czym wspomniałem powyżej - utwórz wejście rozruchowe w formularzu wejściowym, a następnie zapisz plik na ścieżce do pliku w oddzielnym katalogu.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Zaktualizuj 2018

Chociaż wszystko poniżej jest nadal prawdą, Rails 5.2 zawiera teraz
active_storage
, który pozwala ładować rzeczy, takie jak przesyłanie bezpośrednio do S3 (lub innych usług przechowywania w chmurze), konwersje obrazów itp. E. Powinieneś sprawdzić

przywództwo
https://edgeguides.rubyonrails ... .html
szyny i sam zdecyduj, co odpowiada Twoim potrzebom.
Chociaż istnieje wiele klejnotów, które całkiem dobrze rozwiązują problem z przesyłaniem plików (zobacz listę na https://www.ruby-toolbox.com/c ... ploads), rails mają wbudowane pomocniki, które ułatwiają własne rozwiązanie.
Użyj pomocnika
file_field
-form w swoim formularzu, a rails obsługuje przesyłanie za Ciebie:
<%= form_for @person do |f| %>
<%= f.file_field :picture %>
<% end %>

W kontrolerze będziesz mieć dostęp do pobranego pliku w następujący sposób:
uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end

Zależy to od złożoności tego, co chcesz osiągnąć, ale powinno wystarczyć do prostych zadań przesyłania plików. Ten przykład pochodzi z instrukcji szyn, możesz tam przejść po więcej informacji:

http://guides.rubyonrails.org/form_helpers. html#uploading-files
http://guides.rubyonrails.org/ ... files
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Wrzesień 2018 r

roku
Dla tych, którzy ostatnio sprawdzali to pytanie,

Rails 5.2+ ma teraz domyślną pamięć ActiveStorage & amp; Gorąco polecam to sprawdzić.
https://guides.rubyonrails.org ... .html
Ponieważ jest teraz częścią rdzenia Rails 5.2+, jest bardzo dobrze zintegrowany & amp; ma świetne funkcje po wyjęciu z pudełka (wciąż wszystkie inne znane klejnoty, takie jak Carrierwave, Shrine, spinacz, ... są świetne, ale ten oferuje bardzo fajne funkcje, które możemy rozważyć w każdym nowym projekcie Rails)
Komenda clip została wycofana z klejnotu na rzecz Rails ActiveStorage.
Oto strona github dla ActiveStorage
https://github.com/rails/rails ... orage
& amp; wiele zasobów jest dostępnych wszędzie
Znalazłem też ten film
https://gorails.com/episodes/f ... s-5-2
bardzo przydatne do zrozumienia funkcji Activestorage
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Istnieje niezły klejnot specjalnie do przesyłania plików:

carrierwave
https://github.com/jnicklas/carrierwave... Jeśli wiki nie pomaga, jest

dobry RailsCast
http://railscasts.com/episodes ... loads
o najlepszym sposobie jego użycia. Podsumowując, formularze Railsów mają pole typu
file
, które wywołuje okno dialogowe przesyłania plików. Możesz go użyć, ale „magia” jest wykonywana przez klejnot
carrierwave
.
Nie wiem, co masz na myśli mówiąc „jak pisać do pliku”, ale mam nadzieję, że to dobry początek.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W porządku. Jeśli nie chcesz przechowywać pliku w bazie danych i przechowywać go w aplikacji takiej jak asset (folder niestandardowy), możesz zdefiniować zmienną instancji innej niż DB zdefiniowana przez attr_accessor: document i użyć
form_for - f.file_field
aby pobrać plik,
W kontrolerze
@person = Person.new(person_params)

Tutaj
person_params
zwraca białą listę
params [: person]
(zdefiniuj siebie)
Zapisz plik jako,
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}")

Uwaga: dodaj tę ścieżkę do
.gitignore
& amp;, jeśli chcesz ponownie użyć tego pliku, dodaj tę
asset_path
ścieżkę do aplikacji przez
application.rb
Ilekroć formularz czyta pole pliku, dostaje miejsce w folderze tmp, później możesz go przechowywać w domu, podałem przykład przechowywania w aktywach

Uwaga
: przechowywanie takich plików zwiększy rozmiar aplikacji, lepiej przechowywać ją w bazie danych za pomocą
spinacza
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W twoim 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

użyj tego do przechowywania w pliku podczas pracy na komputerze lokalnym

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się