2016-09-17 7 views
0

コンテキスト - 私はレールを学習するためのクイズアプリを作成しています。特定のビューには、質問とラジオボタンのリストが表示されます。ユーザーは各質問に対してオプションを選択し、[送信]ボタンをクリックする必要があります。 SubmitボタンはAJAXコールを呼び出し、コントローラを呼び出します。クエリはRailsコンソールのレコードを返しますが、内部サーバエラー5003の結果を返します

- コントローラでは、クエリは7MSで500内部サーバーエラー(ActiveRecordの:0.2msのを)完了

を返し

しかし、私はRailsのコンソールで同じクエリを実行し、私は適切な結果を得る。

ログ出力 -

質問ロード(0.2msの) "の質問に" SELECT * "質問" "質問" "ID" = FROM。。? LIMIT 1 [[ "ID"、29]] 7MSで

完了500内部サーバーエラー(ActiveRecordの:0.2msの)

Railsのコンソール出力 -

質問ロード(0.6ms) SELECT "質問"。* FROM "質問" WHERE "質問"。 "ID" =? LIMIT 1 [ "ID"、29]] =># IRB(メイン):017:0>

モデル

class Question < ActiveRecord::Base 
    belongs_to :title 
end 

表スキーマ

create_table "questions", force: :cascade do |t| 
    t.string "question" 
    t.string "option1" 
    t.string "option2" 
    t.string "option3" 
    t.string "option4" 
    t.string "answer" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "title_id" 
end 

コントローラ

def check_answers 
    answers = params[:answers] 
    @response = [] 
    my_hash = {} 
    answers.each_key do |key| 
     question_id = answers[key]['question_id'] 
     user_answer = answers[key]['user_answer'] 
     correct_answer = Question.find_by id: question_id 
     correct_answer_jk = correct_answer[0]['answer'] 
     my_hash['question_id'] = question_id 
     my_hash['user_answer'] = user_answer 
     if user_answer == correct_answer_jk 
     my_hash['response'] = 'Correct' 
     my_hash['correct_answer'] = '' 
     else 
     my_hash['response'] = 'Incorrect' 
     my_hash['correct_asnwer'] = correct_answer_jk 
     end 
     @response.push(my_hash) 
    end 
    respond_to do |format| 
     format.js 
     format.html 
    end 
    end 

私は問題を捜したが、私は問題を解決するための指針を得ていない。私はSqliteを使用していることに注意してください。

EDITEDは development.log

は 「/ questions_controller/check_answersをGET開始しましたか?回答%5B0%5D%5Bquestion_id%5D = 29 &回答%5B0%5D%5Buser_answer%5D = B &回答%5B1%5D%5Bquestion_id%5D = 30 &回答%5B1%5D%5Buser_answer%5D = A &回答% 5B2%5D%で5D = 31の&アンサー%5B2%の5D%5Buser_answer%5D = D &回答%5B3%5D%の5Bquestion_id%5D = 32の&アンサー%5B3%の5D%5Buser_answer%5D = C &アンサー%5B4%5Bquestion_id% 5D%5Bquestion_id%5D = 33 &回答%5B4%5D%5Buser_answer%5D = B &回答%5B5%5D%5Bquestion_id%5D = 34 &回答%5B5%5D%5Buser_answer%5D = A &回答%5B6%5D% 5Bquestion_id%5D = 35 回答%5B6%5D%5Buser_answer%5D = B ":: 1:2016-09-18 01:03:15 +0530処理:{0} => {"question_id" = "29"、 "user_answer" => "B"}、 "1" => {0} "question_id" => "31"、 "user_answer" => "D"}、 "3" => "question_id" => "30"、 "user_answer" => "A" > "question_id" => "32"、 "user_answer" => "C"}、 "4" => {"question_id" => "33"、 "user_answer" => "B"}、 "5 "question_id" => "35"、 "user_answer" => "B"}}} "=" {question_id "=>" 34 "、" user_answer "=>" A "}、 " 6 ""1" => {"question_id" => "30"、 "user_answer" = " => "A"}、 "2" => {"question_id" => "31"、 "user_answer" => "D"}、"question_id" => "33"、 "user_answer" => "B" }、 "question_id" => "34"、 "user_answer" => "A"}、 "5" => {"question_id" => "35"、 "user_answer" => B "}}キーは0です
[1m [36mQuest Load(35.2ms)[0m [1mSELECT" questions "。* FROM "質問 "WHERE"質問 "。 LIMIT 1 [0メートル[[ "ID"、43ms(ActiveRecordの:35.2ms)29] 完成品500内部サーバーエラー

NameError(check_answers' アプリ/コントローラ/ questions_controllerにおける未定義のローカル変数または方法correct_answer_rels' for #<QuestionsController:0x007ff3d50dd3a8>):
app/controllers/questions_controller.rb:27:in
ブロック。 RB:21:each_key'
app/controllers/questions_controller.rb:21:in
check_answers'

レンダリング /Users/tusharsaurabh/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/でミドルウェア/テンプレート/レスキュー/ _source.erb (3.7ms)レンダリング /Users/tusharsaurabh/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/アクション_ディスパッチ/ミドルウェア/テンプレート/レスキュー/ _tra ce.text.erb(0.8ms)レンダリング /Users/tusharsaurabh/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates /rescues/_request_and_response.text.erb (2.1ms)レンダリング /Users/tusharsaurabh/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch /middleware/templates/rescues/diagnostics.text.erb (89.5ms)

テンプレート

check_answers.js.erb

<% @response.each do |my_hash| %> 
<% if my_hash['response'] == 'Correct' %> 
    $('#<%=my_hash["question_id"]%>').css('background-color','green'); 
<%else%> 
    $('#<%=my_hash["question_id"]%>').css('background-color','red'); 
<%end%> 
<%end%> 
+1

エラートレースまたは完全な開発ログを見てみましょう。この質問に答えるのに役立つだろう。 –

答えて

0

RailsはAjaxリクエストでテンプレートをレンダリングしようとしています。何をレンダリングするかを指定しなければ、レンダリングするテンプレートがあると思うでしょう。あなたがいない場合、あなたは500エラー

format.js {render json: {foo: 'bar'}} 
+0

はい、これは当てはまります。 –

0

Railsはあなたのcheck_answersアクション用のビューテンプレートを期待してしまいます。 app/views/your_controllerに見つからないので、500のステータスコードで応答しています。サーバのログにエラートレースが表示されるはずです。

この問題を解決するには、JSビューテンプレートを追加してください。 check_answers.js.erbapp/views/your_controllerディレクトリに適切なJavaScript応答があります。

+0

私はViewフォルダにテンプレートを持っています。テンプレートのスナップショットも提供しています。テンプレートを一度呼び出すと、可変応答が設定されています。 –

1

js/htmlのリクエストごとに、railsはリクエストの種類に応じてapp/views/controller_nameディレクトリのaction_name.html.erb/action_name.js.erbとしてビューテンプレートをチェックします。

ここで、それぞれのディレクトリに "check_answers.js.erb"ファイルを追加してチェックしてください。そこにあなたのjavascriptを指定してください。

それとも、ビューテンプレートを指定したくない場合は、あなたが format.jsとしてrespond_toブロックでレンダリングするものを指定する必要があります{JSONをレンダリング:{your_json}}

部未満あなたの質問に関連していないが、

変更点: 変更点:1)ハッシュの代わりにeach_valueを使用します(値を扱う場合のみ)。 2)DBクエリをモデルに移動しました。 3)my_hashの作成方法を変更しました。 4)であれば

@response =[] 
answers.each_value do |value| 
    correct_answer = Question.get_saved_answer(value['question_id']) 
    my_hash = {'question_id': value['question_id'], 'user_answer': value['user_answer'], 'response': 'Correct'} 
    if user_answer != correct_answer 
     my_hash['response'] = 'Incorrect' 
     my_hash['correct_asnwer'] = correct_answer 
    end 
    @response.push(my_hash) 
end 


Question.rb 

def get_saved_answer(question_id) 
    result = Question.find_by id: question_id 
    result[0]['answer'] 
end 

へのif-elseループの削減は、あなたがレールを学ぶために続けて、それが何らかの形でお手伝いを願っています。

+0

ありがとう@Tushar。私はすでにコントローラのアクションに対応するjs.erbファイルを持っています。 –

0

問題だった - 私は、配列を期待していたので、私はコード化された -

correct_answer = Question.find_by id: question_id 
correct_answer_jk = correct_answer[0]['answer'] 

find_byではなく、それは単一のActive Record ::リレーションを返します、配列を返しませんが。ちょうど[0]を削除し、それは働いた。

お時間をいただき、サポートをいただき、ありがとうございます。

関連する問題