Zapis do pliku

Witam wszystkich! Mam następujący problem - stworzyłem sobie generator pewnych danych, które to dane zwraca dodaje mi do tablicy, a następnie zwraca mi na ekran (nie są one nigdzie przechowywane w bazie ani nic) - chciałbym, aby na stronie gdzie mogę obejrzeć wygenerowane dane był przycisk “Zapisz” który otwierałby przeglądarkowe okno zapisu pliku (wybór ścieżki, nazwy pliku itp.) po czym zapisywałby te wyniki do pliku - dane te są tekstowe, preferowany format pliku to csv - mógłby ktoś mi pomóc? Metodą prób i błędów starałem się coś sam wykombinować ale bez skutku - totalnie nie wiem gdzie leży błąd - szczegóły na: http://stackoverflow.com/questions/8749142/saving-file-after-passing-parameter (jednak wolałbym otrzymać odpowiedź tutaj, a nie na stack’u)

hmm, nie bardzo rozumiem, ale domyślam się, że dane masz wygenerowane, chcesz przekonwertować dane do csv a następnie wysłać taki plik użytkownikowi ?:slight_smile:

hmn, dokładnie. Ale mam w takim razie pytanie - muszę mieć gdzieś utworzony już plik na serwerze, w który będę te dane zapisywał? Czy jest on dopiero tworzony po wybraniu miejsca, gdzie ma zostać zapisany u użytkownika? chodzi mi o sytuację, gdy np. 2ch userów będzie chciało zapisać plik i czy nie nadpiszą sobie wzajemnie pliku zanim go ściągną na dysk?

Nie trzeba tworzyć żadnego pliku na dysku serwera - po prostu dane z pamięci (serwera) są wysyłane “jako plik” i dopiero na dysku użytkownika są zapisywane. Nie ma sytuacji, że te dane się nadpiszą bo to są dwa różne komputery :slight_smile:

ok, już coś się dzieje, ale jeszcze nie tak jak bym tego chciał - a mianowicie chciałbym, aby zapis odbywał się po naciśnięciu przycisku dopieoro - w widoku mam coś takiego:

.. ..wypisywanie wyników na ekranie, poprzez iterowanie po tablicy wyników @table.. .. <%= submit_tag 'Zapisz' , :method => :savefile(@table) %>
Metoda savefile(parametr) jest zdefiniowana przeze mnie, jednakże coś jest nie tak z tym moją definicją metody przycisku, ponieważ otrzymuję błąd:

/home/ofca/Praca/inzynierka/app/views/generators/show.html.erb:23: syntax error, unexpected '(', expecting ')' ...Zapisz' , :method => :savefile(@table) );@output_buffer.safe... ... ^
rozumiem tylko, że coś nie bangla przez parametr, ale nie wiem o co chodzi:/ proszę o pomoc :confused:
dorzucę jeszcze implementację metody savefile:

def savefile(parametr) doc = File.new("wyniki.csv", "w") parametr.each do |n| doc << n.to_s + "\n" end send_file doc, :type => 'text; charset=utf-8' end

100 postów i… braki w podstawach. Po pierwsze - :savefile(@table) to nie jest poprawne wyrażenie Rubiego! Po drugie - :method => :savefile nie ma sensu w Railsach (method może być :get, :post, :put, :delete). Powinieneś przeczytać przynajmniej http://guides.rubyonrails.org/action_controller_overview.html oraz http://guides.rubyonrails.org/routing.html

niestety zdaję sobie sprawę, że mam braki w podstawach - strasznie mnie to wkurza, dlatego też po obronie wracam do podstaw podstaw i pożądnie guidesy przejdę bez ściemniania (takie postanowienie noworoczne :wink: ) - chciałoby się posiadać jakiegoś mentora, do którego z wątpliwościami można by było zawsze uderzyć, ale niestety - staże są zdecydowanie za krótkie :stuck_out_tongue:
btw. zaraz przewertuję te linki - dzięki - ps. usuń kropkę z ostatniego linka

zrobione

hura! plik już się zapisuje:)

def savefile @generator = Generator.new(params[:generator]) @bigtable = Rails.cache.read("pass") doc = "wyniki.csv" File.open(doc, "w"){ |f| f << @bigtable} send_file(doc, :type => 'text; charset=utf-8') end

Jak by co do CSV masz osobną bibliotekę, do odczytu, zapisu CSV.

wiem wiem, ale akurat tutaj stwierdziłem, że robię tak “proste” rzeczy, że posłużę się klasycznym zapisem (mam nadzieję, że to był dobry wybór)

[quote=Ofca]def savefile @generator = Generator.new(params[:generator]) @bigtable = Rails.cache.read("pass") doc = "wyniki.csv" File.open(doc, "w"){ |f| f << @bigtable} send_file(doc, :type => 'text; charset=utf-8') end
[/quote]
Moim zdaniem @gotar ma rację… Nie wnikając co jest w @bigtable i dlaczego chcesz to robić zmienną/atrybutem instancji możesz zrobić tak:

CSV.open('wyniki.csv', 'w') { |csv| csv << [@bigtable] }

i wydaje mi się, że takie rozwiązanie jest lepsze od “gołego pliku”.