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