2017-06-06 15 views
-1

私は、ユーザーがテストを作成し、そのテストの表示ビューに移動し、質問への回答を含むフォームを塗りつぶすアプリケーションをビルドしています。質問に対する答えが(コントローラで定義されている)「correct_answer」と一致する場合は、答えが正しいというフラッシュメッセージが表示され、root_pathに進むボタンが表示されます。答えが間違っていると、フラッシュに「間違った答え」と表示されます。Railsのフラッシュメッセージ

私の問題は、答えが与えられていなくても、フラッシュメッセージが間違った答えを言うということです。ユーザーがフォームを送信した後にそのメッセージが表示されるようにしてください。私はなぜこれが起こっているのか理解しています、私はそれを修正する方法については不明です。ここでは、テストのためのショーのビューは次のとおりです。ここで

<div class="col-md-8 col-md-push-2"> 
     <h4>Current Score: <%= @test.score %></h4> 
     <br /><br /> 


     <div class="form_group"> 
     <%= form_tag test_path(@test), :method=> 'get' do %> 
      <h4>What is my first name?</h4> 
      <div class="form-group"> 
       <%= text_field_tag :answer, params[:answer], class: 'form-control' %> 
      </div> 
      <% if !flash[:success] %> 
      <div class="form-group"> 
       <%= submit_tag "Submit", class: "btn btn-primary" %> 
      </div> 
      <% end %> 
     <% end %> 
     </div> 

     <% if flash[:success] %> 
      <%= link_to "Continue", root_path, class: "btn btn-success pull-right" %> 
     <% end %> 
    </div> 

は、問題のshowアクションが含まれているテストのためのコントローラは、次のとおりです。

class TestsController < ApplicationController 

def index 
    @test = Test.new 
    @tests = Test.all 
end 

def show 
    @test = Test.find(params[:id]) 
    correct_answer = "jack" 
    user_answer = params[:answer] 
    if user_answer == correct_answer 
     flash.now[:success] = "That is correct!" 
     new_score = @test.score += 1 
     @test.update(score: new_score) 
    elsif params[:answer] != correct_answer 
     flash.now[:danger] = "Wrong answer" 
    end 
end 

def create 
    @test = Test.create(test_params) 
    if @test.save 
     redirect_to test_path(@test) 
     flash[:success] = "Test created" 
    else 
     flash[:danger] = "There was a problem" 
     render "index" 
    end 
end 

def destroy 
    @test = Test.find(params[:id]) 
    if @test.destroy 
     flash[:success] = "Your test was removed" 
     redirect_to root_path 
    end 
end 

private 

    def test_params 
     params.require(:test).permit(:score, :user_id) 
    end 
end 

はこれを行うには良い方法はありますか?もしそうでなければ、どういうわけか初期の負荷にフラッシュメッセージが現れないようにすることはできますか?フォームが提出されたら、それが表示されるようにします。前もって感謝します。

+0

フォームを提出したときにのみ 'params [:answer]'は利用できますか? – Pavan

+0

初期ロード時にサーバーで生成された 'params 'で質問を更新できますか? – Pavan

答えて

2

params[:answer]が未定義で、==jackでないため、フラッシュがトリガーされます。

あなたは言う:

私の問題は、フラッシュメッセージは何も答えが与えられていない場合でも、間違った答えを言うだろうということです。

この結果ではロジックがオフになっていますが、コードにはparams[:answer]が定義されています。フォームはまだレンダリングされていないため定義できません。

たぶん、あなたの状態は次のようになります。

elsif params[:answer].present? && params[:answer] != correct_answer 
    flash.now[:danger] = "Wrong answer" 
end 

伝統的に、フォームにフォームの上映とPOSTは何でも起こる前にこのフラッシュを見ている理由である、separeteアクションです。

+0

ありがとうございました! –

関連する問題