2010-11-05 7 views
0

Je commence à travailler avec Ruby et je le module suivant:Ruby retourne TypeError: ne peut pas convertir l'objet en chaîne

module RadioreportHelper 
    @totalsum = 0 
    @radio 
    @daysAndTotals 

    def load(service, transactionsPerDay) 
    puts "#{service} : #{transactionsPerDay}" 
    @radio = service 
    @daysAndTotals = transactionsPerDay 

    transactionsPerDay.each{|day, total| 
     @totalsum += total 
    } 
    end 
    attr_reader :radio, :daysAndTotals, :totalsum 
end 

Je suis en suivant l'unité cas de test:

class RadioreportHelperTest < ActionView::TestCase 
    fixtures :services 
    def test_should_return_populated_radio_module 
    service = Service.find_by_name("Mix") 
    transactionsPerDay = {1=>20, 2=>30, 4=>40, 5=>50} 
    radioReport = RadioreportHelper.load(service, transactionsPerDay) 
    assert_not_nil(radioReport) 
    assert_equal("Mix", radioReport.radio.name) 
    end 
end 

Mais je reçois toujours l'erreur suivante: TypeError: ne peut pas convertir service en chaîne

Je veux le service objet à être dans le module RadioreportHelper et stocké dans la variable @radio pas la chaîne. Merci, pour toute l'aide les gars!

+0

Est-ce que Service.find_by_name ("Mix"). To_string aussi jeter l'erreur? Si tel est le cas, envisagez de le convertir vous-même au lieu de vous fier à sa méthode to_string. –

+0

Non, ça marche très bien. Service.find_by_name ("Mix") apporte un objet "service" du service de maintenance sans problème. Je veux que l'objet de service passe au module RadioreportHelper. Cependant, quand je le passe de mon test au module, il dit que error (TypeError: ne peut pas cacher le service en String). – marcelo

Répondre

1

Essayez d'ajouter une méthode to_s à votre modèle de service.

def to_s 
    service # or some other method in the model that returns a string 
end 

Il ne faut pas appeler to_s à l'intérieur d'une expression interpolée, à savoir "#{service}" renverra le résultat de service.to_s.

EDIT

Ne me dérange tout cela. Votre méthode RadioreportHelper.load n'est pas atteinte - à la place, vous obtenez load à partir de ActiveSupport :: Dependencies :: Loadable. Essayez de renommer la méthode load en autre chose.

(Je déteste les collisions de noms.)

+0

Hey zetetic! J'ai déjà ce to_s implémenté dans le service. Mais je voulais enregistrer le "service" dans le RadioreportHelper et maintenir la référence dans la variable @radio afin que je puisse l'utiliser dans les vues. Je ne comprends pas vraiment l'erreur (TypeError: ne peut pas convertir le service en chaîne). Il devrait garder le "service" qui vient du test au module, correct? – marcelo

+0

Étrange. L'erreur se produit-elle uniquement lors du test? Ou cela se produit-il aussi lors du rendu du template? – zetetic

+0

Je l'ai seulement essayé lors des tests. J'utilise ruby ​​1.9.2 et rails 3 – marcelo

1

Vous devriez certainement essayer ceci:

puts "#{service.to_s} : #{transactionsPerDay}" 

Bien que je ne suis pas sûr de savoir comment interpolation pour hash est traitée dans les chaînes non plus, de sorte que vous devrez peut-être utiliser

puts "#{service.to_s} : #{transactionsPerDay.to_s}" 
+0

Merci Brett, mais je veux avoir le modèle de service lui-même, pas la chaîne, dans mon RadioreportHelper. Le module Service a le to_s implémenté: def to_s return "id: # {id}, groupe: # {groupe}, emplacement: # {location}, genre: # {genre}" fin – marcelo

+0

Avez-vous une trace de pile de votre erreur? L'erreur que vous avez listée: 'TypeError: impossible de convertir Service en String' semble provenir de la ligne de ma réponse. Si vous utilisez service.to_s dans votre ligne 'puts', il affichera le service sous forme de texte pour cet appel put. Cela ne change pas la valeur de la variable de service, donc dans la ligne suivante quand vous faites '@radio = service' vous aurez toujours le modèle de service dans votre RadioreportHelper. –

+0

Thx Brett, mais j'ai toujours la même erreur. @zetetic a suggéré que c'était peut-être une méthode utilisée par une classe parente (et puisque ruby ​​n'écrase pas/surcharge ses méthodes) alors je devrais la changer.Cependant, quand je l'ai changé, j'obtiens ceci: NoMethodError: méthode non définie 'loadRadioTransaction 'pour RadioreportHelper: Module – marcelo

Questions connexes