2016-04-16 6 views
4

Wenn ein Benutzer beispielsweise auf "Take a Picture" klickt, wie können wir das create.html.erb-Formular mit Attributen auffüllen, die speziell für diese hervorgehobene Aufgabe festgelegt wurden, wie für 12 Tage und unter Tue, Thu?Wie reformieren Sie die Voreinstellung für vorgestellte Objekte?

Ich verwende die reform gem.

#challenges_controller 
def new 
    @challenge = Challenge.new 
    respond_modal_with @challenge, location: root_path 
end 

#challenges/new.html.erb 
<%= simple_form_for(@challenge, html: { data: { modal: true } }) do |f| %> 
    <%= f.text_field :action, placeholder: 'Enter a Custom Challenge' %><br> 
    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 %> 
    <%= f.submit %> 
<% end %> 

enter image description here

#challenges_controller 
def create 
    @challenge = Challenge.new(challenge_params) #create is being used to GET and then POST 
    if params[:step] == '2' 
    @challenge = current_user.challenges.build(challenge_params) 
    @challenge.save 
    redirect_to @challenge 
    end 
end 

#challenges/create.html.erb 
<%= simple_form_for(@challenge) do |f| %> 
<%= hidden_field_tag :step, 2 %> 
    Challenge: <%= f.text_field :action %> 
    Do For: <%= f.number_field :days_challenged, value: 10 %> 
    Do On: <%= f.collection_check_boxes :committed %> 
<% end %> 

enter image description here

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' => ['Tue', 'Thu'] 
    } 
    end 
end 

Da es jetzt ChallengeForm keinen Einfluss auf create.html.erb hatte. Wie können wir die Standardeinstellungen in create.html.erb je nach den vorgestellten :action richtig einfügen?

Antwort

2

starten:

challenges_controller

def new 
    @form = ChallengeForm.new(Challenge.new) 

    respond_modal_with @form, location: root_path 
    end 

    def create 
    challenge = Challenge.new(challenge_params) 
    @form = ChallengeForm.new(challenge) 

    if params[:step] == '2' 
     @form.validate(user_id: current_user.id) 
     @form.save 
     redirect_to challenge 
    end 
    end 

Herausforderungen/new.html.erb

<%= simple_form_for @form, html: { data: { modal: true } }, url: 'your_challenge_create_path', method: :post do |f| %> 

    <%= f.text_field :action, placeholder: 'Enter a Custom Challenge' %><br> 
    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 %> 
    <%= f.submit %> 
<% end %> 

Herausforderungen/create.html.erb

<%= simple_form_for @form, html: { data: { modal: true } }, url: 'your_challenge_create_path', method: :post do |f| %> 
    <%= hidden_field_tag :step, 2 %> 
    Challenge: <%= f.text_field :action %> 
    Do For: <%= f.number_field :days_challenged %> 
    Do On: <%= f.collection_check_boxes :committed %> 
<% end %> 

ich vielleicht ein bisschen weg, aber Sie erhalten den Punkt?

+0

@ AnthonyGalli.com Wenn Sie "die Controller-Logik" sagen, was meinen Sie damit? Es wäre hilfreich, wenn Sie Einzelheiten dazu angeben könnten, was Sie versucht haben und wo genau es nicht wie erwartet funktioniert. Vielleicht folgen Sie dem Code mit einem 'binding.pry'? Nur ein Vorschlag. –

+1

Danke für Ihre Hilfe! Ich habe dir die Belohnung gegeben, weil du so geduldig warst. Ich konnte die Arbeit nicht reformieren, also musste ich eine Mischung aus Javascript und Ruby verwenden, um mich in die richtige Richtung zu bringen. Ihre Antwort war jedoch hilfreich, um mich in die richtige Richtung zu bringen, und ich werde vielleicht in der Zukunft darauf zurückkommen, wenn ich weitere Herausforderungen hinzufüge. –

0

Sie übergeben die @challenge an das Formular, aber möglicherweise möchten Sie das Formularobjekt übergeben.

Um das zu tun, einige Code in der Steuerung hinzu:

@challenge_form = ChallengeForm.new(@challenge) 

und dann in der Ansicht:

<%= simple_form_for(@challenge_form, html: { data: { modal: true } }) do |f| %> 
+0

Ich habe gerade festgestellt, dass Sie nach create.html.erb gefragt haben, die einen anderen Formularcode hat. Das Prinzip ist das gleiche, übergeben Sie das Formularobjekt. Aber es ist nicht super konventionell, eine create view zu haben. Wenn Sie zwei neue Ansichten benötigen, möchten Sie diese möglicherweise in separate Controller aufteilen. –

+0

Ich habe es einfach versucht. Ich konnte es nicht zur Arbeit bringen:/ –

+0

@ AnthonyGalli.com Können Sie Ihre Fehler posten? Haben Sie immer noch Probleme mit der "nicht initialisierten konstanten Reform"? –