Licznik pobrań pliku

Witam. Czytając o ruby zastanawiam się nad jedną rzeczą. Jak wykonać skrypt, który policzy ile razy dany plik został pobrany?

pole w bazie dajesz ze stanem 0 typu int
każde kliknięcie na plik np poprzez ajax dodaje 1 do licznika. Może coś bardziej szczegółowo, z czym masz problem?

Chodzi mi o to jak przechwycić od użytkownika to, że kliknął na Link “Pobierz plik”.

@licznik_pobrań = 0 if (nastąpiło_zdarzenie_od_uzytkownika) // wychwytujemy to czy użytkownik kliknął w odsyłacz do pliku "Pobierz plik" licznik_pobrań = licznik_pobran + 1 //jeśli ktoś kliknął w odnośnik do pliku to dodajemy +1 // zapisujemy to w bazie albo pliku txt.
Właśnie o coś takiego mi chodzi, ale jak to przechwycić, że użytkownik chciał ściągnąć ten plik.

Ja bym zrobił (z głowy jeżeli używasz ActiveRecord):

[code]class FileUpload < AR:Base
validates_numericality_of :count
end

class FileUploadsController < ApplicationController
def show
FileUpload.find(params[:id]).increment(:count)
redirect_to “your/file/asset/path”
end
end

W widoku

Ściągnij plik[/code]
To jest chyba najprostszy scenariusz. Nie testowałem, ale mam nadzieję, że koncepcja jest ok.

Wystarczy jak dla mnie w pliku gdzie chcesz to mieć dać akcje onClick i tam skrypcik w js z zapytaniem incrementującym. W sumie możliwości i podejść jest wiele.

I najlepiej inkrementacja w jakimś noSQL jeśli zależy Ci na wydajności.

Przerabiam właśnie książkę do Ruby “Beginning Ruby. From novice to Professional” i pewne rzeczy nie zostały w niej wyjaśnione. Mam taki kod:

def each_vowel(&code_block) %w{a e i o u}.each { |vowel| code_block.call(vowel) } end
Mógłby mi wytłumaczyć co to jest &code_block, code_block.call oraz %w{a e i o u} ?

masz tu tylko wywołanie metody z parametrem

[a e i o u] to tablica, leci po tym petla i (call - wywołuje metodę code_block z parametrem)

poczytaj sobie w dokumentacji jak nie ma w ksiazce

Oczywiście trzeba pamiętać, że ten plik nie może być w public/foo/bar bo wtedy serwer http bedzie serwował plik z pominięciem aplikacji. Polecam lekture: http://www.therailsway.com/2009/2/22/file-downloads-done-right. Dobrym rozwiązaniem dla Ciebie może być jakiś rack wpięty w applikacje Rails, który będzie Ci serwował te pliczki, jest sporo przykładów jak zrobić coś w tym stylu dla plików trzymanych w MongoDB na GridFS.

godzio89 co do kodu ktory wkleiłeś Możesz tej metody użyć np. tak:

each_vowel { |obj| puts obj.upcase } A E I O U => nil
Każdy z elementów tablicy będzie parametrem wejściowym bloku kodu, który podałeś do metody. W moim przykładzie będzie to { |obj| obj.updase }. To może być trudne do zrozumienia na początku