2010-12-12 3 views
0

J'ai une étape qui échoue avec ce qui suit ...espace supplémentaire dans l'étape de concombre lors de l'utilisation to_s (long):

expected #has_content?("July 4, 2009") to return true, got false 

Le problème, je pense, est l'espace supplémentaire entre « Juillet » et " 4 ". J'utilise published_on.to_s (: long) à la fois dans la définition d'étape et dans la vue, donc je ne suis pas tout à fait sûr de l'origine de l'espace supplémentaire.

Des idées?

+0

Montrez-nous l'étape et sa définition s'il vous plaît. –

+0

Voici les définitions des étapes -> https://gist.github.com/b6ba990085532c6d05bf –

Répondre

2

Il est ce qui se passe lorsque vous essayez:

Date.civil(2010, 7, 4).strftime("%e") # => " 4" 

Et Rails utilise %e dans leur :longformat. Le plus drôle est que %e n'est pas documented.

Je voudrais ajuster ma définition d'étape pour correspondre au comportement de Ruby si vous ne vous souciez pas de l'espace supplémentaire (les espaces supplémentaires ne seront pas affichés dans HTML de toute façon). Si vous faites attention à ce sujet, il squish:

Date.civil(2010, 7, 4).to_s(:long).squish # => "July 4, 2010" 

Ecraser est avaiable dans Rails 3. Si vous utilisez Rails 2, vous pouvez utiliser gsub:

Date.civil(2010, 7, 4).to_s(:long).gsub(/\s+/, " ") # => "July 4, 2010" 
+0

Yup, concombre (tout comme les navigateurs) ignore HTML répété, donc même si dans la source la date a 2 espaces, le concombre ne voit que comme un. – Jacob

0

je suis tombé sur le même problème avec mon test de concombre aujourd'hui! Le problème (comme indiqué par iain) est que Date::DATE_FORMATS[:long] est "%B %e, %Y". Le %e, selon ri strftime, donne un complété par des blancs nombre de jours:

%d - Day of the month, zero-padded (01..31) 
      %-d no-padded (1..31) 
    %e - Day of the month, blank-padded (1..31) 

Donc, par défaut, ce que je vois dans Rails 3.1.3:

> d = '2012-02-01'.to_date 
=> Wed, 01 Feb 2012 

> d.to_s(:long) 
=> "February 1, 2012" 

Étrangement, Rails utilisations un format de jour différent pour le :long format de fois (%d, qui donne "01") comme pour dates (%e, qui y OMAINES " 1"):

> d = '2012-02-01'.to_time 
=> 2012-02-01 00:00:00 UTC 

> d.to_s(:long) 
=> "February 01, 2012 00:00" 

> Time::DATE_FORMATS[:long] 
=> "%B %d, %Y %H:%M" 

> Date::DATE_FORMATS[:long] 
=> "%B %e, %Y" 

La solution est alors d'utiliser "%-d" pour la journée dans votre chaîne de format au lieu de %e:

> Date::DATE_FORMATS[:long] = "%B %-d, %Y" 
=> "%B %-d, %Y" 

> d = '2012-02-01'.to_date 
Wed, 01 Feb 2012 

> d.to_s(:long) 
=> "February 1, 2012" 

Vous pouvez simplement ajouter cette ligne à une nouvelle initialiseur , config/initializers/date_formats.rb:

Date::DATE_FORMATS[:long] = "%B %-d, %Y" 

Veuillez commenter https://github.com/rails/rails/pull/1994 si vous souhaitez voir cette valeur par défaut modifiée dans Rails.

0

Pour ce que ça vaut, je préfère utiliser le correctif "%-d" (ou même "%-e"!qui donne les mêmes résultats) que ".squish", qui est spécifique à Rails, et pas aussi portable (pourquoi ne pas utiliser le ".squeeze" Ruby-natif, ou même ".squeeze(' ')" à ce moment-là, si vous ne voulez pas déranger avec les formats de date?).

Aussi, en guise de mise à jour: @iain mentionne que '% e' n'est pas documenté. Pour ce que ça vaut, it is now! (bien qu'intéressant, pas spécifiquement "%-e", qui, si vous l'essayez, est valide, et fonctionne!)

Questions connexes