Przechwytywanie tesktu z pliku

Witam, mam taki problem, zapisuje sobię plik za pomocą Paperclipa w aplikacji, plik tekstowy i chciałbym podczas tego przechwytywania w metodzie create wyświetlić pierwszą linię tego pliku:

def create @book = Book.new(params[:book]) #tutaj chciałbym przechwycić pierwszą linie tekstu Nie wiem za bardzo jak przechwycić w tym miejsu dany plik otworzyć go i zczytać linię end
Paperclipowy model nazywa się Asset. W modelu tym mam zapisywane pliki.

plik masz w params[…]

możesz do niego normalnie się dobrać, pewnie jest w tmp, ale url do niego jest dostepny

a co do pierwszej lini

  File.open('somefile.txt', &:readline)

Hmm nie wiem czy nie lepiej bylo by to zrobic w preprocessorze peperclipa. Paperclip umozliwia latwe ich pisanie.

Czyli w params[:book][:assets_attributes] jest plik. Mam tam takie dane:

{"0"=>{"asset"=>#<ActionDispatch::Http::UploadedFile:0x9725b38 @original_filename="book", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"book[assets_attributes][0][asset]\"; filename=\"book\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/tmp/RackMultipart20110605-28672-nm40nj>>}}
A jak dowiedzieć się jak jest ścieżka do tego pliku?

a na dole co masz? Jak byk @tempfile=#<File:/tmp/RackMultipart20110605-28672-nm40nj>> po uloadzie przed zapisaniem jest tam

Ok, ale np żeby podać tą ścieżkę i otworzyć ten plik który jest w tmp przed zapisaniem File.open(@tempfile, &:readline) lub params[:book][:assets_attributes].tempfile nie mogę go otworzyć. W pierwszym przypadku po wykonaniu @tempfile.inspect wskazuje mi że jest pusty a w drugim że nie ma takiej metody więc jak dostać się do tej ścieżki?

name = upload[‘uploads’].original_filename
directory = “public/avatars”
path = File.join(directory, name)
File.open(path)

Spróbuj tak, może już zapisany, tylko wstaw swoje ścieżki i dane

Zrobiłem wcześniej tak

params[:book][:assets_attributes].orginal_filename params[:book][:assets_attributes].tempfile
Oba przypadki wskazują na brak tych metod i zaznaczam że obie metody wywołuję jeszcze przed zapsianiem załączników, czyli przed:

if @book.save

Wcześniej zrobiłem tak co zadziałało aby dostać się do załącznika:

asset = File.open(Rails.root.join("public/system/assets/#{@book.id}/original/#{@book.assets[0].asset_file_name}"))

Jest to dobre tylko po zapisaniu obiektu Book. Co oczywiście działa ale czy to jest poprawnie?

Chodzi mi bardziej o to co się dzieje jeszcze przed zapsianiem obiektu Book i Asset ponieważ chciałbym dostać się do takiej ścieżki @tempfile danego załącznika po to aby sparsować ten plik jeszcze przed zapisaniem i wykonać na nim taką operację. Czy jest to możliwe? Nie bardzo rozumiem jak dostać się do atrybutu @tempfile i gdzie on jest zapisywany? W pamięci? Dobrze rozumiem params[:book][:assets_attributes] zwraca Hash? w Takim razie jak się dobrać do @tempfile?

tempfile = params[:asset][:tempfile]

File.open(tempfile)

teoretycznie coś takiego powinno spokojnie zadziałać.

Niestety nie działa dostaje komunikat:

You have a nil object when you didn't expect it! You might have expected an instance of ActiveRecord::Base. The error occurred while evaluating nil.[]
jak próbuje wyświetlić zawartośc params[:asset][:tempfile] w kontrolerze

[code]Parameters:

{“utf8”=>“✓”,
“authenticity_token”=>“d/FwhW2el926s4faZ+sUFX0+jbF1gjgoj18hnG+vw9k=”,
“book”=>{“name”=>“Chrome”,
“assets_attributes”=>{“0”=>{“asset”=>#<ActionDispatch::Http::UploadedFile:0xbac8e14 @original_filename=“book.html”,
@content_type=“text/html”,
@headers=“Content-Disposition: form-data; name=“bookmark[assets_attributes][0][asset]”; filename=“book.html”\r\nContent-Type: text/html\r\n”,
@tempfile=#<File:/tmp/RackMultipart20110605-6559-1ra246i>>}}},
“commit”=>"Create Bookmark[/code]

Dość dziwne bo powinno zadziałać bez problemu. Narazie zostanę przy wcześniejszym rozwiązaniu chodź nie powiem że interesuje mnie rozwiązanie którym wspomniałeś :slight_smile:

params[:upload][:file].tempfile.readline

no to musi działać, wstawiasz tylko model i nazwe uploadu od paperclip i musi działać.

Ja bym to zorbił w preprocessorze do paperclip. Masz tam prosty dostęp do wszystkiego co trzeba.

Może zadziała

params[:book][:assets_attributes][:0][:asset].tempfile.readline

Mając taki params:

{"utf8"=>"✓", "authenticity_token"=>"d/FwhW2el926s4faZ+sUFX0+jbF1gjgoj18hnG+vw9k=", "book"=>{"name"=>"Chrome", "assets_attributes"=>{"0"=>{"asset"=>#<ActionDispatch::Http::UploadedFile:0xbac8e14 @original_filename="book.html", @content_type="text/html", @headers="Content-Disposition: form-data; name=\"bookmark[assets_attributes][0][asset]\"; filename=\"book.html\"\r\nContent-Type: text/html\r\n", @tempfile=#<File:/tmp/RackMultipart20110605-6559-1ra246i>>}}}, "commit"=>"Create Bookmark
próbowałbym znaleźć rozwiązanie tak, żeby po kolei wyświetlać składowe params: najpierw sprawdź co da Ci params[:books][:name], później params[:books][:assets_attributes], dalej (…) aż do params[:book][:assets_attributes][:0][:asset].tempile - to tak na szybko patrząc na to jak jest ułożony ten params.

Super zadziałało ale coś takiego zero w apostrofach nie jako symbol: params[:book][:assets_attributes][‘0’][:asset].tempfile.readline

Dziękuje za pomoc :slight_smile: Gotar dzięki za poświęcony czas, tak na marginesie gdzie mogę znaleźć informacje na temat preprocessora paperclipa?

http://railscasts.com/episodes/182-cropping-images

Tu masz przykład napisanego jednego, jest masa w google i w dokumentacji.

Witam ponownie, nie mogę załadować preprocesora, mam wersję railsów 3.0.3. Stworzyłem katalog w lib o nazwie paperclip_preprocessors i w nim swój plik preprocesora ale niestety nie jest on ładowany. Co mam zrobić aby móc z niego skorzystać. Dodałem do pliku application.rb ścieżkę do tego katalogu ale też nie pomogło.