NoMethodError в Ruby

У меня есть немного рубинового кода:

def createCal(cal)
    mod = @on + @off #line creating error.
    @daycount = 0       
    cal
  end

Это генерирует следующую ошибку: NoMethodError at /calendar undefined method `+' for nil:NilClass file: main.rb location: createCal строка: 83

Я использую это в Sinatra, поэтому я могу распечатать @on и @off на веб-странице и подтвердить, что они действительно загружаются со значениями. Я также делаю '@ooo = @on + @off' в своем шаблоне haml, и это дает 7, чего и следовало ожидать, потому что on равно 4, а off 3.

Есть идеи?

ОБНОВИТЬ:

Вот как я обрабатываю @on и @off

post '/calendar' do
  @on = params["on"]
  @off = params["off"]
  @date = params["date"]
  a = Doer.new
  @var = a.makeDate(@date)
  @on = @on.to_i
  @off = @off.to_i
  @ooo = @on + @off
  @cal = a.makeCal(@var)
  haml :feeling
end

person Noah Clark    schedule 06.09.2011    source источник
comment
Это напоминает мне вопрос, который я задал некоторое время назад. Мне было интересно, почему я не могу получить свои атрибуты в Rails. Теперь я не слишком много знаю о Синатре, но должны ли on и off вызываться с использованием методов on и off вместо @on и @off? Потому что похоже, что ваши переменные/атрибуты не извлекаются правильно, когда говорится, что они возвращают nil...   -  person Jonathan Allard    schedule 07.09.2011
comment
Проголосовал за, чтобы противостоять отрицательному голосованию, которое я не считаю оправданным, поскольку это совершенно правильный вопрос.   -  person Gazler    schedule 07.09.2011
comment
Я не думаю, что это должны быть методы. Это просто переменные, которые я извлекаю из формы.   -  person Noah Clark    schedule 07.09.2011


Ответы (2)


Вы обращаетесь к двум разным переменным экземпляра:

  • @on в post — это переменная экземпляра для вашего экземпляра Sinatra.
  • @on в createCal – это переменная экземпляра вашего экземпляра Doer.

Чтобы использовать @on и @off по своему усмотрению, вам нужно изменить их на аргументы, переданные методу createCal. Что-то вроде этого:

class Doer
  def createCal(cal, on, off)
    mod = on + off
    # more code...
    cal
  end
end

post '/calendar' do
  a = Doer.new
  date = a.makeDate params['date']
  @cal = a.makeCal date, params['on'], params['off']

  haml :some_template
end
person wersimmon    schedule 06.09.2011
comment
mod создает значение модуля, которое я использую позже. - person Noah Clark; 07.09.2011
comment
Да, я вижу это сейчас. Обновлен мой пример с некоторыми лучшими намеками на происходящее размахивание руками. - person wersimmon; 07.09.2011
comment
Спасибо. Это сработало, и я фактически очистил свой /calendar, чтобы метод makeDate вызывался внутри моего метода makeCal. Не знаю, лучше это или хуже. - person Noah Clark; 07.09.2011
comment
Это намного лучше. Подумайте об этом с чужой точки зрения, используя свой код: мне просто нужен календарь от X до Y, просто скажите, как отправить вам эти даты, мне все равно, как это работает внутри. - person wersimmon; 07.09.2011

Ваши переменные экземпляра, вероятно, не входят в область действия метода. Попробуйте следующее, чтобы проверить эту теорию:

def createCal(cal, on, off, daycount)
  mod = on + off #line creating error.
  daycount = 0       
  cal
end

И вызовите его (в блоке /calendar) с помощью:

createCal(cal, @on, @off, @daycount)
person Gazler    schedule 06.09.2011
comment
Я пытался сделать именно это раньше. Тем не менее, я попробовал еще раз, чтобы убедиться, что я ничего не упустил. Та же ошибка, номер строки и т. Д. Возникают снова. - person Noah Clark; 07.09.2011
comment
Можете ли вы опубликовать весь соответствующий код на github/ в gist/pastie и предоставить образец URL-адреса, который вы тестируете, и я проверю его. - person Gazler; 07.09.2011
comment
Извините, я имел ввиду какой URL локально, как в /calendar?on=5&off=200 и т.д. - person Gazler; 07.09.2011
comment
/calendar?on=3&off=4&date=9/12/2011 что-то в этом роде. - person Noah Clark; 07.09.2011
comment
После проверки вашей сути, это определенно проблема области. Проверьте gist.github.com/1198898, который работает. Посмотрите, что я сделал с вашим постом/блоком календаря. - person Gazler; 07.09.2011
comment
Согласен, переменные экземпляра в контроллере не являются методами экземпляра в экземпляре класса Doer. - person jkebinger; 07.09.2011
comment
gist.github.com/1198898 — это должно делать то, что вы хотите. У меня есть переходы @on и @off в класс Doer. Возможно, вам придется внести небольшие изменения, если вы хотите, чтобы эти значения передавались в шаблон. Вам просто понадобится @on = a.on; @off = a.off - person Gazler; 07.09.2011