2016-04-04 18 views
7

Użytkownik może wejście zwyczaj :action lub wybrać wyróżnioną :action:Jak przygotować _form dla polecanych obiektów?

<%= 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 %> 

Jeśli użytkownik zdecyduje polecanych :action nowe wyzwania/_form jest wstępnie wypełniane jego wybrany :action, ale teraz chciałbym zabierz go z pomocą na wyższy poziom!

<%= 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 %> 

Jak mogę wstępnie wypełnić pozostałe cechy wyróżnionego wyzwania, takie jak "Do For" lub "Do On"?

Na przykład, jeśli użytkownik wybrał wyróżniona :action: 'Run a Mile to bym wstępnie wypełnić formularz z Run a Mile, Mon, Wed, Fri, 30 Days.

+0

Możesz zainicjować instancję 'Challenge' z wartościami, np.' @challenge = Challenge.new (days_challenged: 12) ', a następnie w formularzu zobaczysz' 12' jako wstępnie wypełnioną wartość dla 'days_chalenged' – MrYoshiji

+0

Witam @MrYoshiji, ale załóżmy, że mam 100 wyzwań. Jak mogę mieć oddzielną wstępnie wypełnioną wartość dla każdej z nich? –

+0

Czy jest to możliwe w javascript? – Shishir

Odpowiedz

2

Możesz użyć simple_form z reform. Reforma da ci obiekt formularza, w którym możesz zastąpić metody, które wypełnią twój formularz.

Oto okrojoną przykład (trzeba będzie dostosować go do przypadku):

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 w sposobach powyżej będzie przekazywać model. Zauważ, że przesuwasz metody getter i nie ma to wpływu na setters (możesz również przesłonić setery, jeśli chcesz zmienić dane formularza przed jego zapisaniem).

W szablonie, zamiast

form_for @challenge 

trzeba będzie:

simple_form_for @form 

To super wspólna biblioteka forma dla Rails i nie mogę sobie wyobrazić, nie jest używany sam!

+0

Hej dobrze, więc utworzyłem aplikację folderu/formularze, a następnie utworzyłem 'challenge_form.rb' z twoim kodem. Zmieniłem mój inny formularz na "simple_form_for @ form". Czy to prawda, do tej pory? Nie mogę uruchomić go od tego miejsca, ani 'action_to_days_challenged_hash' ani' action_to_commited_hash' nie jest ustawiane w drugorzędnej formie. Tylko "akcja" nadal ustawia –

+0

Wyjście HTML: 'Do: ' Nie mam, jeśli to jest pomocne. –

+0

Wygląda dobrze. Czy przekazujesz model do formularza opisanego w readme reform? https://github.com/apotonick/reform (Przepraszam, powinienem był określić, że naprawdę mówię o używaniu 'simple_form' +' reform') - zaktualizowałem moją odpowiedź. –