Salve a tutti!
Sono Lorenzo da Roma!
Non ho ancora familiarizzato con rubyonrails e la sua immediatezza mi
affascina.
Sto sviluppando in rubyonrails un’applicazione di fatturazione e mi sono
imbattuto nella relazione HABTM (has_and_belongs_to_many).
Vi elenco le tabelle in questione:
Tab. Products ( id, codice, prezzo)
Tab. Receipts (id,prezzo_tot, data_elaborazione)
Tab. Products_Receipts (receipt_id [INTEGER], product_id [INTEGER])
Come da documentazione ho creato le relazioni nei modelli:
model Receipt ----> has_and_belongs_to_many :products
model Product ----> has_and_belongs_to_many :receipts
E fin quì tutto ok!
Ho creato dunque nel partial (app/view/receipts/_form.rhtml)
un lista di prodotti con checkboxes nel modo seguente:
file : app/view/receipts/_form.rhtml
[…]
<% Product.find(:all).each do |g| %>
-
<%= g.codice %>
checked="checked" <%
end %> />
<% end %>
[...]
----------------------------------------------------------------------------------------------------------------
Riesco dunque a visualizzare l'elenco dei prodotti nel form della
fattura
(receipt) ma, quando salvo o edito una fattura,
non viene scritta nessuna riga sulla tabella "Products_Receipts".
Purtroppo non sono ancora entrato nella logica “ad oggetti” quindi non
mi
muovo così agilmente con rails…
…dunque … AIUTO !!!
Grazie a tutti !
A presto!
Lorenzo
Lorenzo P. ha scritto:
Riesco dunque a visualizzare l’elenco dei prodotti nel form della fattura
(receipt) ma, quando salvo o edito una fattura,
non viene scritta nessuna riga sulla tabella “Products_Receipts”.
Come effettui il salvataggio?
In realtà non ho impostato nessuna azione di salvataggio sul controller
Receipt ed proprio qui, credo il problema.
Ecco il codice dell’azione create:
def new
@receipt = Receipt.new
end
def create
@receipt = Receipt.new(params[:receipt])
if @receipt.save
flash[:notice] = ‘Receipt was successfully created.’
redirect_to :action => ‘list’
else
render :action => ‘new’
end
end
Il 05/07/07, Luca G. [email protected] ha scritto:
A… Dimenticavo… Grazie per l’interessamento!!!
Il 05/07/07, Lorenzo P. [email protected] ha scritto:
Pe forza!!!
Il 05/07/07, Stefano G. [email protected] ha scritto:
Lorè, stasera passi a casa mia, dopo cena, viè presto che ce ne avremo de
cose da fa…
Bella
jeko
Ciao, scusa per il ritardo. Basta aggiungere la seguente riga a #create
(ovviamente prima di salvare).
@receipt.products << Product.find(params[:product_ids])
Quando usi la macro HABTM, ActiveRecord crea un attributo di istanza,
che corrisponde (secondo convenzione) al nome della classe endpoint
pluralizzato. ES: Product #=> products
Con la riga aggiunta, vai a leggere dalla request i parametri checked,
tramite find carichi dal db i relativi oggetti e li accodi alla
collection products.
Da notare che la chiamata al db è unica, perché verrà utilizzata
(internamente ad AR) la versione del find con array di id, cioè un’unica
where condition, invece che n query.
La magia di rails provvederà poi, a salvare le relazioni quando verrà
invocato #save.
PS: Non ho avuto il tempo di testare il codice, quindi se c’è qualche
errore o dubbio, comunicamelo.
Ciao.