सेवा ऑब्जेक्ट को तुरंत चालू नहीं कर सकता है

मैं अपने रेल आवेदन के लिए कुछ रिफैक्टरिंग करने की कोशिश कर रहा हूं।

मैंने एक प्रश्नोत्तरी सेवा सेवा (ऐप/सेवाएं/quiz_completion.rb) बनाई है:

class QuizCompletion
  def initialize(quiz, user)
    @quiz = quiz
    @user = user
  end

  def pass?
    wrong_answers = 0
    @quiz.questions.each do |question|
      answer = @user.answers.where("question_id = ?", question.id).first
      if !answer.correct
        wrong_answers += 1
      end
    end
    if wrong_answers > 2
      return false
    else
      return true
    end
  end
end

फिर मेरे प्रश्न नियंत्रक में मैं सेवा ऑब्जेक्ट को तुरंत चालू करने का प्रयास करता हूं:

class QuestionsController < ApplicationController
  before_filter :require_user
  def show
    @quiz = Quiz.find(params[:quiz_id])
    @question = Question.next(params[:id])
    if @question != nil
      redirect_to quiz_path(@quiz.id, question_id: @question.id)
    else
      evaluation = QuizCompletion.new(@quiz, current_user)  #instantiate Service Object!
      if evaluation.pass? 
        Quiz.complete(current_user, @quiz)
        redirect_to quiz_complete_path(@quiz.id)
      else
        redirect_to quiz_fail_path(@quiz.id)
      end
    end
  end

निजी समाप्त

हालांकि, जब मैं नियंत्रक परीक्षण चलाता हूं, तो मुझे यह त्रुटि मिल रही है:

Failure/Error: get :show, quiz_id: @quiz.id, id: question3.id
 NoMethodError:
   undefined method `stringify_keys' for #

Does someone has an idea what's going on? Why can't I instantiate a QuizCompletion object in my QuestionsController?

Thanks for your help,

Anthony

1
त्रुटि किस त्रुटि पर होती है?
जोड़ा लेखक TheDude, स्रोत
@TheDude, त्रुटि उस रेखा पर होती है जहां मैं सेवा ऑब्जेक्ट को तुरंत चालू करता हूं: मूल्यांकन = QuizCompletion.new (@quiz, current_user)
जोड़ा लेखक Toontje, स्रोत
@ ब्लू स्मिथ, मैं अपने प्रश्न नियंत्रक का कोड जोड़ता हूं और एक टिप्पणी करता हूं जहां मैं सेवा ऑब्जेक्ट को तुरंत चालू करता हूं। प्रश्नोत्तरी एक आवृत्ति चर है जो प्रश्न # शो एक्शन विधि में सेट है।
जोड़ा लेखक Toontje, स्रोत
क्या आप अपने परीक्षण और नियंत्रक का कोड भी पोस्ट कर सकते हैं? @quiz कहां से आता है?
जोड़ा लेखक Blue Smith, स्रोत

2 उत्तर

मुद्दा मिला, स्पष्ट रूप से समस्या मेरी सेवा वस्तु के नामकरण के साथ थी। रेल फ्रेमवर्क quiz_completion.rb नाम के बारे में उलझन में आया क्योंकि वहां पहले से ही एक प्रश्नोत्तरी (quiz.rb) मॉडल मौजूद है।

इसलिए मैंने अपनी सेवा ऑब्जेक्ट का नाम मूल्यांकन (मूल्यांकन.आरबी) में बदल दिया:

class Evaluation
  def initialize(quiz, user)
    @quiz = quiz
    @user = user
  end

  def pass?
    wrong_answers = 0
    @quiz.questions.each do |question|
      answer = @user.answers.where("question_id = ?", question.id).first
      if !answer.correct
        wrong_answers += 1
      end
    end
    if wrong_answers > 2
      return false
    else
      return true
    end
  end
end

जब मैं इसे प्रश्न नियंत्रक से कॉल करता हूं तो यह नाम भी अधिक समझ में आता है:

evaluation = Evaluation.new(@quiz, current_user)
  if evaluation.pass? 
    Quiz.complete(current_user, @quiz)
    redirect_to quiz_complete_path(@quiz.id)
  else
    redirect_to quiz_fail_path(@quiz.id)
  end
0
जोड़ा

मैं अपनी पहली सेवा ऑब्जेक्ट को भी चालू नहीं कर सका- मुझे यह त्रुटि मिली

uninitialized constant MyServiceObject (NameError)

मैं वसंत का उपयोग कर रहा था और इसे इसके साथ रोकना पड़ा: वसंत स्टॉप । उसके बाद यह काम किया।

0
जोड़ा