Has_and_belongs_to_many come riempire la join table?

2009/2/15 Mauro [email protected]:

[…]
Si pone pero’ il problema che l’oggetto supplier non e’ visibile
nell’action filter_category_in_ sector.

che importa? filter_category_on_sector deve solo mostrare le categorie
per un certo settore; sarà poi l’action del form (create, suppongo) a
ricevere tutti i dati. l’action dovrà fare qualcosa tipo:

@supplier = Supplier.create(params[:supplier])

sta invece al supplier stesso fare la cosa giusta, ovvero prendere,
dopo la creazione, i dati dell’attributo virtuale (ovvero gli id delle
categorie) e usarli per riempire categories.

se hai dubbi, prova semplicemente a loggare il contenuto di params
nell’action (logger.debug params.inspect), e dagli un’occhiata: vedrai
come vengono resi i campi del fields_for.

questa cosa degli attributi virtuali viene usata spesso: ad esempio,
molti plugin di autenticazione usano due attributi virtuali
sull’oggetto utente, con nomi tipo password e password_confirm, e
bloccano invece il mass assignment del vero campo password, così al
salvataggio controllano se password e password_confirm sono stati
assegnati, e se sì che siano uguali, e infine riempiono il vero campo
password (quello che sta sul db).

2009/2/15 Pietro G. [email protected]:

assegnargli le categorie di appartenenza.
in breve:

  • in Provider, crei un attributo virtuale, che so: categories_wannabe;
  • nel form di creazione, passi le categorie con questo nome, ad
    esempio con fields_for :categories_wannabe;
  • sempre in Provider, metti un after_create o un after_save (a seconda
    se ti interessa solo il caso creazione o anche il caso modifica) in
    cui assegni le categorie.

Ok, perdonami ma sto andando un po in confusione, troppe cose tutte
assieme per me :slight_smile:
Allora: ti spiego dove sono arrivato e dove mi sono arenato.
localhost:3000/suppliers/new richiama l’action new del controller
supplier.
La view dell’action new e’:

<% form_for(@supplier) do |f| %>
<%= f.error_messages %>
<%= render :partial => “form”, :locals => { :f => f, :label_text =>
“Crea”} %>
<% end %>

il partial contiene tutti i campi relativi agli attributi del modello
Supplier che devono essere valorizzati per creare un nuovo supplier.
All’interno di questo partial ho aggiunto:

<%= collection_select “category”, :sector_id, @sectors, :id, :name,
:prompt => “seleziona il settore” %>

<%= observe_field :category_sector_id, :frequency => 1, :update => 'category_container', :url => {:action => 'filter_category_in_sector'}, :with => "'sector_id='+value" %>

La collection_select e’ per poter selezionare il settore e
l’observ_field mi dovrebbe dare le categorie relative al settore
selezionato.
Per poter far funzionare la collection_select ho aggiunto nell’action
new di supplier_controller la variabile @sectors = Sector.find(:all).
L’observe_field chiama l’action filter_category_in_sector definita nel
controller in questo modo:

def filter_category_on_sector
@categories = Category.find_all_by_sector_id(params[:sector_id])
render :layout => false
end

e ovviamente ho creato la vista filter_category_in_sector:

<% fields_for @supplier.categories_wannabe do |f| %>
<% end %>

Questo codice e’ solo di prova per iniziare a capire il funzionamento
di fields_for e degli attributi virtuali che mi hai suggerito di
utilizzare.
Si pone pero’ il problema che l’oggetto supplier non e’ visibile
nell’action filter_category_in_ sector.

2009/2/16 Mauro [email protected]:

@supplier = Supplier.create(params[:supplier])
<% end %>

e mi da errore dicendomi che viene richiamato un oggetto inesistente
nil.categories_wannabe.

Sono in stanb_by :frowning: e in stato confusionale :slight_smile:
Hai tempo per darmi una mano?

2009/2/16 Pietro G. [email protected]:

mmmmm, allora mi sfugge qualcosa…l’action
filter_category_on_sector non deve far altro che crearmi una serie di
checkboxes relative alle varie categorie, in questo modo l’utente
dovrebbe poter assegnare una o piu’ categorie al nuovo supplier.
La view dell’action filter_category_on_sector la devo ancora
completare, devo vedere come creare le checkboxes, ma, giusto per
vedere se qualcosa funziona, ho messo:
<% fields_for @suppliers.categories_wannabe do |f| %>
<% end %>

e mi da errore dicendomi che viene richiamato un oggetto inesistente
nil.categories_wannabe.