Visite da incrementare

Ciao a tutti!!
Nel mio progetto c’è una classe “artist”, creata con scaffold, che si
collega a un database nel quale c’è una colonna chiamata
“visite”(formato integer)
Ho impostato che di default il valore delle visite all’artista
selezionato fosse zero, e vorrei che ogni volta che si apre la pagina
show dell’artista in questione il suo @artist.visite si incrementi di
uno.
Ho provato mettendo in cima alla pagina show.html.erb il codice
seguente:
<% @artist.visite += 1%>

ma penso proprio che non vada a toccare quello che c’è nel database
-_-’. Devo implementare un metodo di incremento delle visite nel modello
artist.rb?
Non è che potreste darmi un qualche suggerimento?
Grazie mille a tutti
(nel caso non si fosse capito sto imparando, molto lentamente, e da
poco, questo splendido framework ;p)
Giò

Il 05 novembre 2009 13.00, Giorgio A. [email protected] ha scritto:

Ciao a tutti!!

ciao a te!

Nel mio progetto c’è una classe “artist”, creata con scaffold, che si
collega a un database nel quale c’è una colonna chiamata
“visite”(formato integer)
Ho impostato che di default il valore delle visite all’artista
selezionato fosse zero, e vorrei che ogni volta che si apre la pagina
show dell’artista in questione il suo @artist.visite si incrementi di
uno.
Ho provato mettendo in cima alla pagina show.html.erb il codice
seguente:
<% @artist.visite += 1%>

Ecco, questo proprio no! :slight_smile:
Non tanto perché, come tu stesso noti, non funziona, quanto perché le
modifiche al db non vanno fatte dall’interno di una view.

Quello che puoi invece fare è inserire, all’interno del metodo show
del controller, la riga:

@artist.increment! :visite

Il metodo :increment! incrementa l’attributo passato (in questo caso
:visite) e salva l’oggetto, mentre il metodo :increment incrementa ma
non salva.

Per maggiori info:

pietro

grazie mille!!!

2009/11/5 Giorgio A. [email protected]:

grazie mille!!!

prego!

pietro

già che ci sono posso anche chiederti dove posso andare a cercare, per
esempio, le classi di ruby che posso usare per definire certi
dati(stamattina sono impazzito per capire come creare il campo “durata”,
per un brano, tramite scaffold…non sapevo se usare time, datetime…)?
e anche per i metodi, eccetera?
sono andato a informarmi su www.ruby-doc.org , però, per esempio, se
penso “allora devo fare in modo che se cancello una certa cosa nel
database l’id di quella cosa si cancelli anche nelle altre tabelle in
cui compariva sempre quella cosa” :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: come posso fare per trovare
effettivamente il codice, il metodo, la sequenza di azioni che mi serve
per farlo??
i vari has_many, belongs_to, ecc…dove trovo una lista di tutte ste
cose(con eventualmente scritto cosa servono)?
scusate per l’ignoranza esagerata…
devo fare un progetto abbastanza complicato, solo che non mi è stata
data alcun tipo di indicazione, sono disperato
pensate che mi han detto “ma sì sarebbe bello fare una community di
utenti, con funzioni di chat, con ajax, tipo
facebook”…ajax??community?? ma se ho iniziato a studiare ruby l
settimana scorsa???..mah…grazie per l’aiuto…
Giò

Scrivo direttamente qui invece che aprire un altro topic, tanto è una
fesseria di domanda:
ho creato scaffoldando la classe artisti( campi “nome”, “arte”,
“storia”, “foto_url” ecc…)
nella index degli artisti voglio poter dare la possibilità di scegliere
un’arte (tra le 6 possibili, quindi tramite combobox…) e filtrare i
risultati in base a quell’arte scelta, ovvero far uscire nella index la
lista di artisti come al solito, ma solo aventi il campo arte = a quella
scelto dell’utente.
E’ possibile fare tutto nella index o devo creare un controller con
vista collegata che fa questa cosa?
Andando oltre, se si potesse fare senza che si effettuasse un refresh
della pagina(tipo con ajax) sarebbe ancora meglio…mi basta sapere che
operazioni dovrei fare, almeno così ogni volta che ho un problema simile
so dove andare a metter le mani(nel model, nel controller, eccc) e non
devo rompere le scatole a nessuno :stuck_out_tongue:
Salutone!
Giò

Il 05 novembre 2009 15.11, Giorgio A. [email protected] ha scritto:

già che ci sono posso anche chiederti dove posso andare a cercare, per
esempio, le classi di ruby che posso usare per definire certi
dati(stamattina sono impazzito per capire come creare il campo “durata”,
per un brano, tramite scaffold…non sapevo se usare time, datetime…)?
e anche per i metodi, eccetera?

questo dipende da te, secondo me integer va più che bene (o float se
vuoi anche le frazioni di secondo), d’altronde con rails hai la
possibilità di scrivere:
5.minutes + 3.seconds
e il risultato è 303, numero.

sono andato a informarmi su www.ruby-doc.org , però, per esempio, se
penso “allora devo fare in modo che se cancello una certa cosa nel
database l’id di quella cosa si cancelli anche nelle altre tabelle in
cui compariva sempre quella cosa” :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: come posso fare per trovare
effettivamente il codice, il metodo, la sequenza di azioni che mi serve
per farlo??
i vari has_many, belongs_to, ecc…dove trovo una lista di tutte ste
cose(con eventualmente scritto cosa servono)?

belongs_to, has_many e compagnia bella:

Ma, prima ancora, parti da qua:

http://api.rubyonrails.org/

Saltando da un link all’altro, soffermati parecchio su
ActiveRecord::Base:

E insomma, troverai tutta la documentazione di ogni singola classe di
rails.

Ricorda però che la “guida di riferimento” (o reference) è perfetta
per sapere come utilizzare le cose, ma non per capirle: per quello
dovresti partire da guide, tutorial ed eventualmente un buon libro (io
ho fatto a meno di libri, ma non è stata una passeggiata).

Alcune guide sono disponibili qui:

Una miniera inestimabile di ricette, consigli e considerazioni
è railscasts:

Alcuni episodi sono specifici per certi plugin o tematiche
particolari, ma molti altri sono più generici.

In giro ci sono migliaia (letteralmente) di tutorial, ma ti consiglio
di stare in guardia: molti sono obsoleti.

Ogni volta che provi a seguire un tutorial e qualcosa non funziona,
prova a cercare su google le due keyword
nome_del_metodo_che_non_funziona obsolete, spesso trovi la soluzione
al problema.

ma se ho iniziato a studiare ruby la settimana scorsa???..mah…grazie per l’aiuto…

Beh, rails non è necessariamente il modo migliore per cominciare a
imparare ruby; considera che, nonostante le API siano ben documentate,
spesso la documentazione migliore è il codice, e sarebbe meglio essere
in grado di leggerlo.

Per prima cosa, quindi, ti consiglio di comprendere bene classi,
moduli, istanze, variabili d’istanza, metodi, Proc, lambda e
quant’altro. Finché non hai chiara la distinzione tra variabili di
classe e d’istanza, ad esempio, tante parti di rails ti rimarranno
oscure.

Tutta la documentazione di ruby la trovi su:

http://www.ruby-lang.org/en/documentation/

È anche (parzialmente?) tradotta in italiano:

http://www.ruby-lang.org/it/documentation/

Infine, google è tuo amico: cerca class NomeDellaClasse e il primo
risultato è in genere la documentazione completa della classe.

Altri sapranno sicuramente suggerirti un buon libro e qualche link che
a me è sfuggito.

devo fare un progetto abbastanza complicato, solo che non mi è stata
data alcun tipo di indicazione, sono disperato
pensate che mi han detto “ma sì sarebbe bello fare una community di
utenti, con funzioni di chat, con ajax, tipo
facebook”…ajax??community??

Ma già che ci sei, se t’avanzano cinque minuti, perché non implementi
anche ebay, mediawiki e amazon?
Tanto, che ci vorrà mai! :stuck_out_tongue:

Non so chi ti dà questi ordini, né in che rapporti sei con costoro, ma
se non si rendono conto che il lavoro non si fa da sé, allora hai un
problema ben più grosso che come implementare questa o quella
funzionalità.

pietro

Non riesco a capire bene questo passo…

#models/artist.rb
class Artist < ActiveRecord::Base

named_scope :by_category, lambda { |category| category.blank? ? {} :
{:conditions => {:category => category}} }
end

già in partenza non mi è chiaro l’utilizzo di lambda, ho cercato in giro
e mi pare di aver capito che prende ogni volta la categoria(nel mio
caso, l’arte) che gli arriva, per effettuare il filtro…
la parte del controller mi è chiara…
però non riesco a far funzionare il form_tag…in ogni caso preferirei
fare una cosa del genere: in cima alla index (quella che si apre di
default, ovvero con l’elenco di tutti gli artisti) ho messo "mostra solo
i producer / dj / cantanti / "ecc… dove se uno clicca su un’arte tra
quelle elencate dovrebbe fare l’azione index, ma passandogli, come dici
tu, invece che il nil che passa di default, il nome dell’arte
specificata…ci credi che sono così capra che non riesco a farlo?
con link_to non so come passare parametri all’azione index…
chiedo ancora scusa per l’ignoranza suina ma da qualche parte devo pur
cominciare :stuck_out_tongue:
ah dimenticavo poi una volta risolto passo a provare jquery, meglio fare
una cosa alla volta ^^
Grazie ancora

Il 08 novembre 2009 19.36, Giorgio A. [email protected] ha scritto:

E’ possibile fare tutto nella index o devo creare un controller con
vista collegata che fa questa cosa?

In che senso? in questo momento non stai usando un controller?

Scrivo direttamente qui invece che aprire un altro topic, tanto è una
fesseria di domanda:
ho creato scaffoldando la classe artisti( campi “nome”, “arte”,
“storia”, “foto_url” ecc…)
nella index degli artisti voglio poter dare la possibilità di scegliere
un’arte (tra le 6 possibili, quindi tramite combobox…) e filtrare i
risultati in base a quell’arte scelta, ovvero far uscire nella index la
lista di artisti come al solito, ma solo aventi il campo arte = a quella
scelto dell’utente.

su stackoverflow c’è una domanda simile:

Il mio consiglio, in breve (se hai dubbi chiedi):

#models/artist.rb
class Artist < ActiveRecord::Base

named_scope :by_category, lambda { |category| category.blank? ? {} :
{:conditions => {:category => category}} }
end

#controllers/artist_controller.rb

def index
@artists = Artist.by_category params[:category]
end

Nella view ti ritrovi @artists che può contenere tutti gli artisti o
solo quelli di una categoria, a seconda che il parametro category
venga fornito o no.

A questo punto nella view metti un form_tag, con action allo stesso
metodo (index, ad esempio), con una select chiamata :category, che
contenga un’opzione “tutte le categorie” con value nil e poi
un’opzione per categoria.

Al momento non ho la possibilità di produrre un esempio funzionante
(dovrei disinstallare mezzo mondo e installare l’altro mezzo), ma non
dovrebbe essere difficile.

Andando oltre, se si potesse fare senza che si effettuasse un refresh
della pagina (tipo con ajax) sarebbe ancora meglio…

Ci sono vari modi; dipende, in particolare, da quanta familiarità hai
con le varie librerie javascript.

In teoria puoi usare i metodi di PrototypeHelper, ma io personalmente
consiglio di usarli solo a chi si vuole male e desidera punirsi per
qualche colpa grave.
Molto meglio (sempre e solo secondo me) usare javascript puro.

Io userei jQuery,
così:
Nella view metterei il form così come sopra, senza cambiamenti; poi
mostrerei l’elenco degli artisti in un div con un id usando una
partial view, che so:

<%= render :partial => 'elenco_artisti' %>
Creerei poi un file js apposta, ad esempio in /javascripts/artist/index.js (in jQuery si consiglia in genere di creare un file js per ogni view e di non mettere javascript nell'html):

$(function() {
$(‘#category’).change(function() {
$(‘#elenco_artisti’).load(‘/artists?’ +
$(‘#category’).serialize());
});
});

Questo fa sì che, quando viene selezionato un valore diverso per la
select, venga avviata una richiesta (get) a /artists (cioè, controller
artists, action index, ma puoi cambiarla) passando il parametro
category.

Ti resta da fare una cosa sola: nel metodo index del controller capire
se è una richiesta Ajax o no, e se lo è restituire solo la
partial_view (la stessa che userai in nella view):

def index
@artists = Artist.by_category params[:category]
if request.xml_http_request? # può essere abbreviato in: if request.xhr?
render :partial => ‘elenco_artisti’
return
end
end

Spero di non avere solo creato confusione; in realtà la procedura è
semplice, noterai che ho scritto pochissimo codice, solo che non posso
testarlo al momento, per cui potrebbe esserci qualche dettaglio da
modificare.

Per ogni dubbio, non hai che da chiedere.

pietro

il form tag non mi funzionava, mi dava una combobox con dentro 3
stringhe apparentemente casuali, tirate fuori da chissà dove
-_-’’’(probabilmente l’avevo scritto male…)
Grazie mille, alla fine opto per una serie di link_to…
a questo proposito, giusto per sapere se è possibile farlo, ho creato
nel model un array ARTI fatto così: [ [“nome arte”, “nome arte che si
salva nel db”], [“nome arte2”, “nome arte db2”], …] (mi è servito per
fare una combobox nella pagina new.html.erb, affinchè l’utente possa
scegliere l’arte da un elenco fisso…).
L’idea che ho avuto è stata di generare, nella index, automaticamente
(magari con un for) i vari link all’azione index, con parametro :arti =>
arte in questione, usando proprio quell’array…proverò e ti farò
sapere se sono riuscito :stuck_out_tongue: grazie mille!

Il 09 novembre 2009 12.37, Giorgio A. [email protected] ha scritto:

caso, l’arte) che gli arriva, per effettuare il filtro…
Si tratta di un named_scope, di cui questa è la documentazione:

http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html

e questi alcuni esempi di utilizzo:

Questo è un named_scope senza parametri:

class Artist < ActiveRecord::Base

named_scope :dj => {:conditions => {:category => “dj”}}
end

Ora Artist.dj restituirà tutti gli Artist di category dj.

In realtà è più complesso (e interessante) di così, perché funziona
come le associazioni: la query viene effettuata solo nel momento in
cui si tenta di accedere al contenuto dell’array, fino ad allora
quello che viene restituito è un proxy, il che fa sì che si possano
combinare più named_scope.

Un named_scope può accettare anche uno o più parametri, nel qual caso
bisogna usare lambda.

Una funzione lambda è una funzione anonima che può essere “passata in
giro”, perché è un oggetto. Si usa in genere quando si vuol passare a
un metodo (o a un oggetto) una funzione da invocare successivamente.

Nell’esempio di prima,

named_scope :by_category, lambda { |category| category.blank? ? {} :
{:conditions => {:category => category}} }

passo a named_scope una funzione lambda che accetta un parametro,
category.

All’interno della funzione lambda uso l’operatore ternario ?: per
decidere lo scope.

Questo significa che se lanci:

Artist.by_category null

o anche

Artist.by_category “”

(è per questo che ho messo blank?), sarà come se avessi scritto:

named_scope :by_category, {}

che non fa assolutamente nulla, infatti Artist.by_category in questo
caso sarebbe uguale a Artist.all.

Se, invece, a by_category passi qualcosa, ad esempio “dj”, è come se
avessi scritto:

Artist.all :conditions => {:category => “dj”}

la parte del controller mi è chiara…

però non riesco a far funzionare il form_tag…
in che senso?

in ogni caso preferirei
fare una cosa del genere: in cima alla index (quella che si apre di
default, ovvero con l’elenco di tutti gli artisti) ho messo "mostra solo
i producer / dj / cantanti / "ecc… dove se uno clicca su un’arte tra
quelle elencate dovrebbe fare l’azione index, ma passandogli, come dici
tu, invece che il nil che passa di default, il nome dell’arte
specificata…
con link_to non so come passare parametri all’azione index…

Ok, allora niente form, basta che tu scriva:

<%= link_to “cantanti”, {:category => “cantanti”} %>

Questo è un link alla stessa action e allo stesso controller ma con un
parametro in più, category.

pietro.

tutto fatto…
allora, in sequenza volevo fare queste cose: fare in modo che la index
mi caricasse 10 artisti per pagina, con i soliti link in basso < << 1
… >> > per cambiare pagina e vedere gli altri artisti…poi ho
scoperto l’esistenza dei plugin…ne ho trovato uno che mi fa la
paginazione infinita(endless pageless), ma non sono riuscito a capire
come diamine si installano(dice la guida di scrivere ruby script/plugin
install git://indirizzo, però non installa un accidente, crea solo una
cartella vuota; allora scopro che serve git; cerco, trovo e installo
msysgit, riprvo e non funziona comunque…come diavolo si fa a
installare i plugin da github?? grazie 1000000