【问题标题】:Sinatra Title SlugsSinatra 标题蛞蝓
【发布时间】:2011-02-09 06:26:45
【问题描述】:

我正在尝试在 Sinatra 中创建一个 slug 助手。这是代码(见here):

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

到底出了什么问题?

【问题讨论】:

  • sinatra 标签应该被移除。这是一个 ruby​​ 问题,而不是 sinatra 问题。

标签: ruby sinatra helpers slug


【解决方案1】:

“到底出了什么问题?”

嗯,错误信息有点不言自明。您调用此方法时将 title 变量设置为 nil。要重现错误,请尝试调用:

slugify(nil)

我想它在这一行失败了:

title = title.gsub(s, rep)

为避免这种情况,您可以在方法的开头检查 nil 标题:

raise "wrong input!" if title.nil?

或(恕我直言更优雅)总是将标题转换为字符串,最终将 nil 转换为空字符串:

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

顺便说一句,您的代码可能需要进行一些严重的重构。首先,尝试替换:

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

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

或使用tr 方法代替gsub 进行字符到字符的替换:

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

【讨论】:

    【解决方案2】:

    我无法复制您所看到的内容。这是我的测试(在 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

    【讨论】:

    【解决方案3】:

    看看iconv的音译能力。它可以让您避免建立自己的字符转换表。

    Obie Fernandez 前来救援:http://www.jroller.com/obie/tags/unicode

    【讨论】:

    • 是的,但我究竟如何将它变成 Sinatra 助手?
    猜你喜欢
    • 2011-02-28
    • 2016-07-22
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2016-06-02
    • 2021-04-04
    相关资源
    最近更新 更多