Passare parametri da vista a controller


#1

Salve a tutti, ho un problema: vorrei passare un parametro da una vista
a un
controller. Per fare questo ho usato le variabili di istanza in questo
modo:

CONTROLLER

@aule = Soluzione.find (:all,
:conditions => [“soluzioni.a_id = ?”,params[:id]])

@soluzioni = Soluzione.find( :all,
:conditions => [“a_id = ? and aula_id= ?”,params[:id],
@aula.id])

VISTA
<% for @aula in @aule %>

<% for soluzione in @soluzioni %>
<%= soluzione.id %>
<% end %>

<% end %>

L’errore che mi viene dato è questo:

Called id for nil, which would mistakenly be 4 – if you really wanted
the id of nil, use object_id

Il problema è dato da @aula.id, ma non so per quale motivo. Probabilmente
non sto passando il parametro nel modo giusto, ma qual è quello giusto?
Se qualcuno sa illuminarmi … :slight_smile:
Grazie!


#2

Che tipo di relazione hanno aule e soluzioni?


#3

sbaglio o il subject della mail dovrebbe essere “… dal controller alla
vista…” ??

Il 03/07/07, Stefano G. removed_email_address@domain.invalid ha scritto:

Salve a tutti, ho un problema: vorrei passare un parametro da una vista a
:conditions => ["a_id = ? and aula_id=
<% end %>
Se qualcuno sa illuminarmi … :slight_smile:
Grazie!


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away


#4

Il 03/07/07, Lucea removed_email_address@domain.invalid ha scritto:

Called id for nil, which would mistakenly be 4 – if you really wanted
the id of nil, use object_id

Il problema è dato da @aula.id, ma non so per quale motivo. Probabilmente
non sto passando il parametro nel modo giusto, ma qual è quello giusto?
Se qualcuno sa illuminarmi … :slight_smile:
Grazie!

Immaginando che la riga che dia eccezione sia:

@soluzioni = Soluzione.find( :all,
:conditions => [“a_id = ? and aula_id=
?”,params[:id], @aula.id])

la risposta ovvia è che @aula non è inizializzato, contiene nil. E quindi
Ruby si arrabbia e solleva un’eccezione. Dov’è inizializzato @aula?

Matteo

Matteo


#5

Il 03/07/07, Lucea removed_email_address@domain.invalid ha scritto:

stefano: 1 a molti (un’aula può essere in più soluzioni)

tarini: no, vorrei proprio passare i parametri dalla vista al controller

matteo: aula prende (dovrebbe prendere…) il valore che vorrei passare
nella vista! con il ciclo ( for @aula in @aule )

Vediamo di capire un attimo. All’interno di una singola azione, la vista
viene valutata dopo il metodo del controller, quindi è impossibile
passare
parametri dalla vista al controller. Detto questo immagino tu voglia
passare
un parametro da un’azione ad un’altra, giusto?


#6

stefano: 1 a molti (un’aula può essere in più soluzioni)

tarini: no, vorrei proprio passare i parametri dalla vista al controller

matteo: aula prende (dovrebbe prendere…) il valore che vorrei passare
nella vista! con il ciclo ( for @aula in @aule )


#7

Ehm… no.
A me servono le righe contenute in @aule una alla volta (che volevo
estrarre
con il ciclo for ottenendo così @aula), poiché nel controller devo elaborare
ogni riga (@aula) e poi ripassarla alla vista, per visualizzare i
risultati
ottenuti.

Da quanto mi dici però questo non è possibile (emmenomale che me l’avete
detto che altrimenti io rimanevo qui a far notte).

Quindi suppongo di dover usare direttamente la variabile @aule che ho
nel
controller.
Solo che in questo modo quando andrò a elaborare ogni riga di @aule, dovrò
memorizzare TUTTI i risultati ottenuti per ogni riga prima di inviarli
alla
vista.

Giusto?


#8

Il 03/07/07, Lucea removed_email_address@domain.invalid ha scritto:

Da quanto mi dici però questo non è possibile (emmenomale che me l’avete
detto che altrimenti io rimanevo qui a far notte).

Quindi suppongo di dover usare direttamente la variabile @aule che ho nel
controller.
Solo che in questo modo quando andrò a elaborare ogni riga di @aule, dovrò
memorizzare TUTTI i risultati ottenuti per ogni riga prima di inviarli
alla
vista.

Giusto?

Sì esatto, ma questo rientra nella normale logica MVC :). Nel controller
prepari quello che poi dovrai visualizzare nella vista.
Comunque devi ragionare a Oggetti e non a Righe. Un modello è più di una
semplice “riga”. Può avere metodi e normalmente tutte le operazioni che
sono
relative ai suoi dati vengono appunto realizzate in questo modo.
Non pensare al database quando progetti la tua applicazione, pensa ai
modelli, ai flussi di interazione.
Spero di esserti stato d’aiuto
Matteo


#9

Vedrò cosa riesco a fare… Grazie per l’aiuto :slight_smile:


#10

La soluzione canonica al tuo problema è questa:

DATABASE:

Tabella aule: (o aulee dipende dall’inflessione che usi)

Id
Campo…
Campo…
Campo…

Tabella Soluzioni

Id
Aula_id
Campo…
Campo…
Campo…

ENVIROINMENT.RB

Add new inflection rules using the following format

(all these examples are active by default):

Inflector.inflections do |inflect|
inflect.irregular ‘aula’, ‘aule’ #oppure aulee
inflect.irregular ‘soluzione’, ‘soluzioni’ #oppure aulee
End

MODEL Aula.rb

class Aula < ActiveRecord::Base

has_many :soluzioni

End

MODEL Soluzione.rb

class Aula < ActiveRecord::Base

belongs_to :aula

End

CONTROLLER

@aula = Aula.find (:first, :conditions => [“id = ?”,params[:id]]) #<—
devi passare l’id dell’aula selezionata

VIEW

<% for soluzione in @aula.soluzioni %>
<%= soluzione.id %>
<% end %>

Ad ogni modo non ho capito perché cicli le aulee… Ovvero, se vuoi
selezionare piu aulee, quale è il critero? Dici che un’aula può essere in piu
soluzioni, ma cosi come ho capito io una soluzione può essere in una sola
aula (uno a molti e non molti a molti)

jeko


#11

On 7/3/07, Stefano G. removed_email_address@domain.invalid wrote:

ENVIROINMENT.RB

Add new inflection rules using the following format

(all these examples are active by default):

Inflector.inflections do |inflect|
inflect.irregular ‘aula’, ‘aule’ #oppure aulee
inflect.irregular ‘soluzione’, ‘soluzioni’ #oppure aulee
End

ho fatto giusto :slight_smile:

MODEL Aula.rb

class Soluzione < ActiveRecord::Base

belongs_to :aula

End

ho fatto giusto :slight_smile:

CONTROLLER

@aula = Aula.find (:first, :conditions => [“id = ?”,params[:id]]) #<—
devi passare l’id dell’aula selezionata

VIEW

<% for soluzione in @aula.soluzioni %>
<%= soluzione.id %>
<% end %>

allora io ho
@aule
che è l’insieme soluzioni per le aule che mi servono (già filtrate in base a
parametri passati alla action)

io devo fare delle operazioni(non banali) in ogni soluzione appartenente
a
@aule, non in una soltanto, poi devo memorizzare i risultati di tali
operazioni in una struttura (un hash nel mio caso) e passare tutto alla
vista per visualizzare i risultati.

per fare questo ho trovato questo metodo (@aule ce l’avevo già
precedentemente, mi serve così com’è per fare altre cose):

@aule = Soluzione.find      (:all,
                              :joins => "as s INNER JOIN 

codificaaule on
s.codificaaula_id = codificaaule.id",
:conditions => ["s.periododidattico_id

?",params[:id]],
:order => “codificaaule.fullname”,
:group => “codificaaule.fullname”)

 @hsh = Hash.new
 for aula in @aule

     #soluzioni corrispondenti all'aula e al periodo didattico 

passati
per parametro
@sol = Soluzione.find( :all,
:conditions =>
[“periododidattico_id =
? and codificaaula_id= ?”,params[:id], aula.id])

    ris=....
    @hsh[aula.id]=ris
 end

Non mi convince il ciclo for, ma funziona. C’è un modo per calcolare @sol
senza usare il ciclo?

Ad ogni modo non ho capito perché cicli le aulee… Ovvero, se vuoi

selezionare piu aulee, quale è il critero? Dici che un’aula può essere in
piu soluzioni, ma cosi come ho capito io una soluzione può essere in una
sola aula (uno a molti e non molti a molti)

esatto uno a molti… un’aula è in più soluzioni… una soluzione può avere
una sola aula…


#12

Beh per come l’hai posta te, direi che è senza dubbio una soluzine al
problema :slight_smile:

Ma ti faccio una domanda indiscreta: come mai non gestisci anche
codificaaule e periododidattico con ActiveRecord, in modo da non dover
usare a mano i join?

jek


#13

Si cerca di usare ActiveRecord per gestire tutto lo strato della
persistenza dei dati. Cosi poi muoverti diventa molto piu facile, e
l’SQL te lo scordi proprio! (il giorno che lo farai te lo segni sul
calendario e cosi poi festeggi la tua festa della liberazione :wink: )

jek


#14

non lo so :smiley:
è che non ci ho proprio pensato :slight_smile:
l’ho fatto nel modo in cui mi veniva più naturale; però adesso so che c’è un
altro modo, quindi vedrò di sfruttarlo.
grazie mille

Silvia