我正在开发一个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)
答案 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