2016-04-04 20 views
7

Un utente può inserire un personalizzato :action o scegliere un caratterizzato :action:Come prepopolare _form per gli oggetti in primo piano?

<%= f.text_field :action %> 
    Or choose a featured challenge: 
<%= f.collection_radio_buttons :action, [['Run a Mile','Run a Mile'], ['Drink 16oz of Water','Drink 16oz of Water'], ['Take a Picture','Take a Picture'], ['1 Drink Max','1 Drink Max'], ['See Eiffel Tower','See Eiffel Tower'], ['Write a Book','Write a Book'], ['Skydive','Skydive'], ['Start a Business','Start a Business'], ['No Snooze','No Snooze'], ['Visit All 50 States','Visit All 50 States'], ['Talk to a Stranger','Talk to a Stranger'], ['Try a New Recipe','Try a New Recipe'], ['Media-fast','Media-fast']], :first, :last %> 

Se un utente sceglie un :action presenti le nuove sfide/_form è pre-popolato con la sua scelta :action, ma ora vorrei portalo al livello successivo con il tuo aiuto!

<%= form_for(@challenge) do |f| %> 
    Challenge: <%= f.text_field :action %> 
    Do On: <%= f.collection_check_boxes :committed %> 
    Do For: <%= f.number_field :days_challenged %> 
<% end %> 

Come posso precompilare gli altri attributi di una sfida in evidenza come, "fare per" o "Do On"?

Per esempio, se un utente ha scelto l'evidenza :action: 'Run a Mile Poi vorrei precompilare il modulo con Run a Mile, Mon, Wed, Fri, 30 Days.

+0

Puoi inizializzare l'istanza 'Challenge' con valori, come' @challenge = Challenge.new (days_challenged: 12) ', e quindi nel tuo modulo vedrai' 12' come valore pre-riempito per 'days_challenged' – MrYoshiji

+0

Ciao @MrYoshiji, ma diciamo che mi piacciono 100 sfide in evidenza. Come potrei avere un valore pre-riempito a parte per ognuno? –

+0

Lo sta facendo in javascript un'opzione? – Shishir

risposta

2

È possibile utilizzare simple_form con reform. La riforma ti darà oggetto modulo, in cui puoi sovrascrivere i metodi che popoleranno il tuo modulo.

Ecco un esempio annacquata (si dovrà regolare al vostro caso):

class ChallengeForm < Reform::Form 
    property :action 
    property :committed 
    property :days_challenged 

    model :challenge 

    def commited 
    super || action_to_commited_hash[model.action] 
    end 

    def days_challenged 
    super || action_to_days_challenged_hash[model.action] 
    end 

    def action_to_days_challenged_hash 
    { 
     'Run a Mile' => 30, 
     'Take a Picture' => 12 
    } 
    end 

    def action_to_commited_hash 
    { 
     'Run a Mile' => ['Mon', 'Wed', 'Fri'], 
     'Take a Picture' => ['Tu', 'Thu'] 
    } 
    end 
end 

super nei metodi di cui sopra saranno delegare alla model. Tieni presente che stai ignorando i metodi getter e non ha alcun effetto su setters (puoi anche sovrascrivere i setter se volessi modificare i dati del modulo prima di scriverlo).

Nel modello, invece di

form_for @challenge 

si avrà:

simple_form_for @form 

Si tratta di una raccolta moduli super-comune per Rails e non posso immaginare di non usarlo io!

+0

Hey okay, quindi ho creato una cartella app/moduli e ho creato 'challenge_form.rb' con il tuo codice. Ho cambiato il mio altro modulo in 'simple_form_for @ form'. È così giusto? Non riesco a farlo funzionare da lì, né "action_to_days_challenged_hash' o" action_to_commited_hash' viene impostato nel modulo secondario. Solo l'azione 'imposta ancora l'output HTML –

+0

:' Esegui per: 'Non lo so se questo è utile –

+0

Sembra giusto. Stai passando il modello al modulo come descritto nel readme di riforma? https://github.com/apotonick/reform (scusate, avrei dovuto specificare che sto parlando di uso 'simple_form' +' reform') - ha aggiornato la mia risposta. –