Как мне обработать неправильное количество аргументов метода? - PullRequest
1 голос
/ 18 июля 2011

Я работаю над сокращением URL-адреса и пытаюсь преобразовать идентификатор URL-адреса, который является числом, в строку, используя базу 36.

Я получаю сообщение об ошибке, указанное под кодом:

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 ]

1 голос
/ 18 июля 2011

Какого типа url.id?

Я думаю, вы ожидаете, что это будет FixNum, чей метод to_s принимает основание, но вместо этого вы получаете что-то другое ... может быть,строка, содержащая число?(например, "1234")

В любом случае, кажется, что метод не требует аргументов, и вы все равно передаете 36

РЕДАКТИРОВАТЬ:

Не удается найти ссылку накласс, который вы указали (Serial), но, возможно, стоит попробовать:

url.id.to_i.to_s(36)
0 голосов
/ 18 июля 2011

у вас есть 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
0 голосов
/ 18 июля 2011

Я сразу вижу следующее:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...