2010-04-17 13 views
0

J'essaie de créer un helper slug à Sinatra. Voici le code (comme on le voit here):Sinatra Titre Slugs

helpers do 
    def sluggify(title) 
    accents = { 
    ['á','à','â','ä','ã'] => 'a', 
    ['Ã','Ä','Â','À'] => 'A', 
    ['é','è','ê','ë'] => 'e', 
    ['Ë','É','È','Ê'] => 'E', 
    ['í','ì','î','ï'] => 'i', 
    ['Î','Ì'] => 'I', 
    ['ó','ò','ô','ö','õ'] => 'o', 
    ['Õ','Ö','Ô','Ò','Ó'] => 'O', 
    ['ú','ù','û','ü'] => 'u', 
    ['Ú','Û','Ù','Ü'] => 'U', 
    ['ç'] => 'c', ['Ç'] => 'C', 
    ['ñ'] => 'n', ['Ñ'] => 'N' 
    } 

    accents.each do |ac,rep| 
    ac.each do |s| 
     title = title.gsub(s, rep) 
    end 
    end 

    title = title.gsub(/[^a-zA-Z0-9 ]/,"") 
    title = title.gsub(/[ ]+/," ")  
    title = title.gsub(/ /,"-") 
    title = title.downcase 

end 

end 

Je continue à obtenir cette erreur:

private method `gsub' called for nil:NilClass 

Qu'est-ce qui ne va pas exactement?

+0

tag sinatra doit être supprimée. c'est un problème de rubis, pas de problème de sinatra. –

+0

Collez le backtrace entier. – rfunduk

Répondre

0

Je ne suis pas capable de dupliquer ce que vous voyez. Voici mon test (en dehors de Sinatra, de sorte que l'aide d'un module):

module Helpers 
    def self.sluggify(title) 
    accents = {['á','à','â','ä','ã'] => 'a'} # Shortened 

    accents.each do |ac,rep| 
     ac.each do |s| 
     title = title.gsub(s, rep) 
     end 
    end 

    title = title.gsub(/[^a-zA-Z0-9 ]/,"") 
    title = title.gsub(/[ ]+/," ")  
    title = title.gsub(/ /,"-") 
    title = title.downcase 
    end 
end 

puts Helpers.sluggify("Testing this!") 

Rendements testing-this.

+0

J'ai la source sur GitHub si vous voulez l'essayer: http://github.com/eturk/marvin –

0

Jetez un coup d'œil à la capacité de translittération d'iconv. Cela vous permettra d'éviter de créer votre propre table de conversions de personnages.

Obie Fernandez à la rescousse: http://www.jroller.com/obie/tags/unicode

+0

Oui, mais comment puis-je faire cela dans une aide Sinatra? –

1

"? Qu'est-ce qui ne va pas exactement"

Eh bien, le message d'erreur est assez explicite. Vous avez appelé cette méthode avec la variable de titre définie sur . Pour reproduire l'erreur, essayez d'appeler:

slugify(nil) 

Je suppose qu'il a échoué sur cette ligne:

title = title.gsub(s, rep) 

Pour éviter cela, vous pouvez vérifier nul titre au début de la méthode :

raise "wrong input!" if title.nil? 

ou (à mon humble avis plus élégant) toujours convertir le titre de chaîne, qui transforme éventuellement nul chaîne vide:

title = title.to_s # "any string" => "any string", nil => "" 

BTW votre code pourrait utiliser un refactoring sérieux. Pour commencer, essayez de remplacer:

title = title.gsub(/a/,/b/) 

avec

title.gsub!(/a/,/b/) 

ou utilisez la méthode tr au lieu de gsub pour le remplacement caractère to_character:

"woot".tr("wt","WT") # => "WooT" 
+0

'tr' est un bon truc. Les racines Perl-y de Ruby sont profondes. – rfunduk