0

Sinatra でスラッグ ヘルパーを作成しようとしています。コードは次のとおりです(ここで見られるように):

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

このエラーが発生し続けます:

private method `gsub' called for nil:NilClass

正確に何がうまくいかないのですか?

4

3 に答える 3

1

「正確に何がうまくいかないのですか?」

まあ、エラーメッセージは自明です。title 変数をnilに設定してこのメ​​ソッドを呼び出しました。エラーを再現するには、次のように呼び出してみてください。

slugify(nil)

この行で失敗したと思います:

title = title.gsub(s, rep)

これを回避するには、メソッドの先頭でnilタイトルをチェックします。

raise "wrong input!" if title.nil?

または(IMHOよりエレガント)常にタイトルを文字列に変換し、最終的なnilを空の文字列に変換します:

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

ところで、あなたのコードは深刻なリファクタリングを使用する可能性があります。まず、以下を置き換えてみてください。

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

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

または、文字から文字への置換にgsubの代わりにtrメソッドを使用します。

"woot".tr("wt","WT") # => "WooT"
于 2010-05-03T11:38:27.670 に答える
0

iconv の音訳機能を見てみましょう。これにより、独自の文字変換テーブルを作成する必要がなくなります。

Obie Fernandez による救助: http://www.jroller.com/obie/tags/unicode

于 2010-04-18T07:00:42.933 に答える
0

あなたが見ているものを複製することはできません。これが私のテストです(Sinatraの外なので、モジュールを使用しているだけです):

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!")

利回りtesting-this

于 2010-04-18T04:38:34.487 に答える