如何处理错误数量的方法参数?

时间:2011-07-17 23:33:04

标签: ruby string activerecord

我正在开发一个URL缩短程序,并尝试使用基数36将URL ID(一个数字)转换为字符串。

我收到了代码下面列出的错误:

def self.create_link(original)
  url = Url.create(:original => original)
  if Link.first(:indentifier => url.id.to_s(36)).nil? or !DIRTY_WORDS.include? url.id.to_s(36)
    link = Link.new(:identifier => url.id.to_s(36))
    link.url = url
    link.save
    return link
  else 
    create_link(original)
  end
end 

我收到以下错误:

wrong number of arguments(1 for 0) file: tinyclone.rb location: to_s line: 91

当我研究错误时,我发现有人提到当一个方法不接受它时,当你试图传入参数值时,这个错误很常见。该错误具体指的是以下行。

if Link.first(:indentifier => url.id.to_s(36)).nil? or !DIRTY_WORDS.include? url.id.to_s(36)

3 个答案:

答案 0 :(得分:1)

url.id的类型是什么?

我认为你期望它是FixNum to_s方法接受基数,但你得到别的东西......也许是一个包含数字的字符串? (例如"1234"

无论如何,该方法似乎不需要参数,但您仍在传递36

编辑:

无法找到您指出的类(Serial)的引用,但这可能值得一试:

url.id.to_i.to_s(36)

答案 1 :(得分:0)

我马上看到的一件事是:

if Link.first(:indentifier => url.id.to_s(36)).nil? or !DIRTY_WORDS.include? url.id.to_s(36)
link = Link.new(:identifier => url.id.to_s(36))

请注意,在第一行中您有:indentifier,在第二行中有:identifier

否则,我同意@Pablo Fernandez的回答,它可能与id的类型有关。

答案 2 :(得分:0)

你有2个型号,但只对其中一个负全部责任。请看一下代码分隔逻辑:

# Link model
def self.create_link(original)
  url    = Url.create(:original => original)
  url_id = url.encoded_id

  find_or_create_by_identifier!(:identifier => url_id)
end


# Url model
def before_validate_on_create
  if url.id.to_s.include? DIRTY_WORDS
    self.errors.add(:base, 'the url is invalid')
  end
end

def encoded_id
  url.id.to_s(36)
end