2016-04-16 20 views
4

たとえば、「Take a Picture」をクリックすると、特集チャレンジに特別に設定された属性を持つcreate.html.erbフォームが、12日のように事前に作成され、Tue, Thuで行われますか?Reformを使用して特集オブジェクトを事前挿入するにはどうすればよいですか?

私は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 

それは今ChallengeFormあるとしてcreate.html.erbに影響を及ぼしませんでした。どうすれば、機能が:actionかによって、デフォルトをcreate.html.erbに正しく挿入することができますか?

答えて

2

はこれを試してみてください:

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 

挑戦/ 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 %> 

挑戦/ 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 %> 

私は少しオフになる場合もありますが、あなたはポイントを得ますか?

+0

@ AnthonyGalli.com「コントローラロジック」とは何を意味していますか?何を試したのか、正確に期待どおりに実行しないのかについての詳細を提供できる場合に役立ちます。多分 'binding.pry'でコードに従ってください。ちょうど提案。 –

+1

あなたの助けてくれてありがとう!あなたがとても忍耐強かったので、私はあなたに賞金をあげました。私は改革を働かせることができませんでしたので、私は正しい方向に私を得るためにjavascriptとrubyを混ぜて使用しなければなりませんでした。あなたの答えは正しい方向に私を押し込むことには役立ちましたが、私はより多くの特色のある課題を追加するので、将来私はそれに戻ってくるかもしれません。 –

0

@challengeをフォームに渡していますが、フォームオブジェクトを渡すことができます。ビュー内の

@challenge_form = ChallengeForm.new(@challenge) 

、その後::それはコントローラでいくつかのコードを追加行うに

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

私は、フォームコードが異なるcreate.html.erbについて質問していることに気付きました。原則は同じで、フォームオブジェクトを渡します。しかし、それは従来のスーパービューではなく、作成ビューです。 2つの新しいビューが必要な場合は、それらを個別のコントローラーに分割することができます。 –

+0

ちょうどそれを試してみました。私はそれを働かせることができませんでした:/ –

+0

@ AnthonyGalli.comあなたはエラーを報告できますか?あなたはまだ「初期化されていない一定の改革」に問題がありますか? –

関連する問題