[ruby-it] has_and_belongs_to_many come riempire la join table?
Mauro
mrsanna1 a gmail.com
Dom 15 Feb 2009 20:37:56 CET
2009/2/15 Pietro Giorgianni <giorgian a gmail.com>:
> 2009/2/15 Mauro <mrsanna1 a gmail.com>:
>> Per poter utlizzare ajax ho utilizzato, come indicato nel manuale
>> agile web development with rails, <% javascript_include_tag :defauts
>> %>.
>> Non quindi se viene utilizzato jquery o prototype, c'e' un modo per capirlo?
>
> rails di default usa prototype.
>
>> Se non sbaglio pero' e' impossibile fare tutto con un'unica
>> operazione, nel senso: creare un nuovo fornitore e contemporaneamente
>> assegnargli le categorie di appartenenza.
>> Devo prima avere gia' in tabella l'id del fornitore e solo cosi' posso
>> successivamente assegnare tale fornitore a diverse categorie.
>> Sbaglio?
>
> non è ancora possibile farlo automaticamente (cioè senza sgobbare); lo
> sarà presto: nella 2.3 dovrebbe introdurre i nested form, che servono
> esattamente a questo.
>
> tuttavia c'è un modo per ottenere il risultato che vuoi.
>
> 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 :-)
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" %>
<div id="category_container">
</div>
<%= 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.
More information about the Ml
mailing list