Problem z zapisywaniem obrazka

Witajcie, próbuje zrobić zapis obrazka przesłanego w formularzu. Oto fragment kodu w formularzu

<div> <%= label_tag(:logo, "Logo firmy") %> <%= file_field_tag 'logo' %> </div>
Oto metoda która obsługuje zapis

#if user attached any logo if params[:logo].present? #if attached check if folder is created path_to_folder = File.join(Rails.root,"lib","assets","images","companies",params[:cat_id]) original_filename = params[:logo].original_filename file_ext = File.extname original_filename #if not create it if !Dir.exist? path_to_folder Dir.mkdir path_to_folder end #now write file File.open(File.join(path_to_folder,params[:name]+file_ext), 'w') do |file| file.write(params[:logo]) end company.logo_path = File.join("companies",params[:cat_id],params[:name]+file_ext) else company.logo_path = "company_default.png" end
I wszystko jest niby ok tworzy foldery, zapisuje plik tylko że przy otwarciu pojawia się błąd.

Error interpreting JPEG image file (Not a JPEG file: starts with 0x23 0x3c)

To jest błąd w domyślnym programie do przeglądania obrazków w innych jest rysowany cały czarny. Gdzie jest błąd? Nie chcę do tego zadania używać jakichś gemów bo nie jest ono na tyle skomplikowane by nie zrobić go samemu. Z góry dziękuje za odpowiedź.
Pozdrawiam
Artur

pewny nie jestem ale jak dla mnie to tu powinien być read

file.write(params[:logo].read)

dał bym też nie File.open(…,‘w’) a wb (binary)

czyli całość

  File.open(name, "wb") { |f| f.write(params[:logo].read) }

PS

Rozumiem chęć napisania tego samemu, jak ktoś się uczy, ale później? Po to te gemy są. Piszą je super ludzie, jakość ich kodu i rozwiązań jest o niebo lepsza niż szary programista może sam z sobie wykaraskać. Ja bym jednak użył ppaerclip albo carrierwave, no ale, może trzeba trochę popracować by zacząć szanować czas ;]

Nie mam odpowiedzi na twoje pytanie ale pokaze ci trik ktory czyni kod czytelniejszym w rails 3.x

[code=ruby]# zle
path_to_folder = File.join(Rails.root,“lib”,“assets”,“images”,“companies”,params[:cat_id])

lepiej

path_to_folder = Rails.root.join(“lib”,“assets”,“images”,“companies”,params[:cat_id])[/code]

[code=ruby]# zle
if !Dir.exist? path_to_folder
Dir.mkdir path_to_folder
end

troche lepiej

path_to_folder.mkdir unless path_to_folder.exist?[/code]
caly trik polega na tym ze Rails.root jest obiektem Pathname

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/pathname/rdoc/Pathname.html

dlatego nie ma zadnego powodu aby uzywac metod z File, Dir, FileUtils

@gotar
Dzięki już teraz działa. A z gemów nie chce korzystać bo aktualnie jeszcze z railsami walczę i zależy mi na tym żeby nie utrudniać tego procesu dodatkowo używaniem gemów “do wszystkiego”.
@lewy313
Dzięki poprawię.
Pozdrawiam
Artur

Nie ma sensu odkrywać koła na nowo. Raczej powinieneś zaczynać od sprawdzenia czy ktoś już nie rozwiązał danego problemu za Ciebie. Jeżeli nie rozwiązał albo rozwiązanie Ci nie odpowiada to dopiero brał się za robienie tego samemu.

Za chwilę wyskoczy Ci kolejny błąd/zmiana z tym uploadem i zamiast skupić się na rozwijaniu appki, będziesz tracił czas na poprawianie problemów, które zostały już uwzględnione w gemie x rozwijanym od y czasu przez z lepszych programistów.

imo przesadzasz wystarczy zbudowac tak wlasne API zeby wymiana dependency byla bardzo prosta

A początkujący programista tak to zrobi, że nie będzie z tym żadnych problemów. Aaaaha :wink:

( co zresztą widać w kodzie wklejonym powyżej, każdy kiedyś zaczyna, a jak zaczyna, to się uczy podstaw, a nie izolacji itp. itd. )

[quote=drogus]A początkujący programista tak to zrobi, że nie będzie z tym żadnych problemów. Aaaaha :wink:

( co zresztą widać w kodzie wklejonym powyżej, każdy kiedyś zaczyna, a jak zaczyna, to się uczy podstaw, a nie izolacji itp. itd. )[/quote]
Masz racje zbyt duzo confreaks ogladam ostatnio :slight_smile: