2012-01-13 6 views
24

Sto creando un modulo per un oggetto Ordine e l'ordine ha molti prodotti, tramite una tabella di join denominata OrderProducts. Qualcosa di così, abbiamo in questo modo:Sintassi per form_for quando si costruisce un array dalle caselle di controllo

<% @order = Order.new %> 
<% form_for @order do |f| %> 
    <% @products.each do |product| %> 
    ... want to iterate over products here to build up "order[product_ids][]", with one checkbox per product 
    <% end %> 
<% end %> 

Di solito per ogni prodotto avrei una check_box_tag, dicendo

<%= check_box_tag "order[product_ids][]", product.id, @order.product_ids.include?(product.id) %> 

Ma questo, mentre si lavora bene, si sente sempre come un po 'di un poliziotto su. C'è un modo per farlo con la sintassi f.check_box? Nota importante: sul progetto in questione sto lavorando su Rails 2.2.2, quindi una soluzione che funzioni su Rails 2 sarebbe l'ideale.

+0

Spero che questo aiuti :) => http: // apidock.com/rails/ActionView/Helpers/FormHelper/fields_for # 357-Utilizzo campi-per-con-molte-associazioni – Prair

+0

Penso che questo sia dove http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper .html # method-i-collection_check_boxes è disponibile in –

risposta

43

Rails < = 2.x (originale)

<% @products.each do |product| -%> 

    <% fields_for 'product[]' , product do |product_fields| -%> 

    [...] 
    <%= product_fields.check_box :id %> 

    <% end -%> 

<% end -%> 

Rails> = 3.x (aggiornato)

<% @products.each do |product| -%> 

    <%= fields_for 'product[]' , product do |product_fields| -%> 

    [...] 
    <%= product_fields.check_box :id %> 

    <% end -%> 

<% end -%> 
+0

questa è la risposta corretta –

+0

Ho provato questo e l'html che viene prodotto è ''. Come puoi vedere il nome è '" product [5] [id] "' considerando che ho bisogno che sia "" order [product_ids] [] "'. Ho frainteso il tuo punto? (btw è .check_box not .checkbox) –

+0

So che è troppo tardi ma potrebbe essere per altri (come me): dovrebbe essere 'nil' invece di': id' - '<% = product_fields.check_box nil%>' – oyatek

1

Ho fatto un certo numero di forme checkbox multipli nel corso degli anni e diverse versioni di Rails. Rails non ha mai fornito un modo veramente pulito per farlo, ma la soluzione di "fuga" che hai trovato è piuttosto buona, vero? È una linea, è esplicita, e finché l'elenco dei prodotti è ragionevolmente breve funzionerà adeguatamente.

Per rispondere alla tua domanda specifica, f.check_box non funzionerà mai per questo. È solo una scorciatoia per il check_box_tag, ma non si applica la semantica. Se vuoi andare su Rails nativo, l'unica possibilità che penso è usare nested attributes. Parte del problema è che non esiste un modo ovvio per questo tipo di cose per funzionare. Il nucleo di Rails ha attraversato un sacco di pianificazione e feedback per ottenere attributi nidificati così come sono e, anche se sembrano un po 'ottusi, catturano i casi d'uso più comuni in modo abbastanza elegante. Ma gli attributi nidificati sono stati introdotti in Rails 2.3 e inoltre introdurranno un bel po 'di overhead concettuale per qualcosa che sembra non aver bisogno della complessità.

Ci sono anche alcuni plugin che forniscono aiuto per questo, anche se non ne ho usato da molto tempo (dal momento che l'era di Rails 2 in realtà). La mia impressione è che anche loro sono eccessivi a meno che non si abbiano molte forme che fanno uso di questo modello.

In breve, penso che dovresti procedere con la soluzione esistente.

+0

Grazie Dasil, ho fatto :) È sempre stato qualcosa che mi ha infastidito un po ', però. –

30

So che l'autore stava cercando per la versione 2 risposte, ma questo è il colpo superiore per google e ho anche se vorrei aggiornare:

Si può fare questo (sto usando 4.0, non so come lontano si va):

<%= form_for @order do |form| %> 
    <%= form.collection_check_boxes(:product_ids, Product.all, :id, :labeling_method) %> 
<% end %> 

per maggiori informazioni: http://edgeapi.rubyonrails.org...

+2

Questo non funziona su Rails 3.2.13 e seguenti: Vedi: http://apidock.com/rails/v4.0.2/ActionView/Helpers/FormOptionsHelper/collection_check_boxes – akira

+1

Questa è la risposta corretta per Rails 4+ –

-1
opzione

formastic gem

check_boxes è molto buona per im complemento più caselle

come

f.input :yourcolumn, :as => :check_boxes, :collection => your_collection 
Problemi correlati