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.
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?
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?
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:
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?
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
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ś
{"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.
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.