Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > разное поведение одного и того же кода


Автор: m_maxser 9.4.2013, 14:27
Здравствуйте,
Есть код, точнее маленькая часть кода, которая безоговорочно работает на машине свего автора и на сервере. А вот у меня работает не всегда. На поиск причины потратил кучу времени, но ничего не нашел. Везде Ruby 1.8.7 и Rails 3.0.11. Сервер - Linux. У меня и у автора кода W7. Вообще компы у нас отличаются только железом. 

Проблема с моей стороны выглядит так: я запускаю проект (Rails start) -> все работает -> перехожу на страницу с тем самым кодом -> получаю ошибку undefined method for nil:NilClass.

Если получилось так как я описал, то я просто перезапускаю рельсы (Rails start) до тех пор пока этот код не начнет работать. Иногда все работает вообще с первого раза, иногда нужно до 10 перезапусков, но рано или поздно оно начинает работать. В чем дело?

Теперь подробнее...
есть две модели
Код

class Publication < ActiveRecord::Base
  ...
  has_many :params
  ...
  accepts_nested_attributes_for :params
  ...

Код

class Param < ActiveRecord::Base
  ...
  belongs_to :publication
  belongs_to :characteristic
  ...
  def value=(value)
      if characteristic.is_a? Characteristic::Bool
          self.string_value = value
          self.bool_value   = !value.blank?
      else
          self.send(self.characteristic.methodname+ '=', value)
      end
  end

...
end

ошибка возникает в контроллере публикации во время множественного присваивания
Код

publication = Pulication.first
chrs = Characrestic.all
characteristics_params = [{:characteristic => chrs[1], :value => 'value1'}, {:characteristic => chrs[2], :value => 'value2'}, {:characteristic => chrs[3], :value => 'value3'} ...]
publication.params_attributes = characteristics_params # ==> вот в этот момент может заглючить 

Т.е. последняя строка передает каждый из вложенных хешей в метод "value=", модели Param. Если конкретный (Rails start) был удачным, то у publication будет коллекция params, содержащая нужные мне данные. Но если рельсы, почему-то, криво запустились, то в метод "value=" из хеша передастся только value, а characteristic_id будет равен nil. Т.е. self.inspect выведет:
Код

#<Param id: nil, characteristic_id: nil, ...>

и соответственно я получаю ошибку 
Код

undefined method 'methodname' for nil:NilClass

Думаю, что проблема не связана с "accepts_nested_attributes_for". Проблема скорее всего в получении данных accessor-методом "value=". Т.к. эту же ошибку может вызвать код вроде:
Код

p = Param.new(characteristics_params[0])

P.S.: Код программы сильно упрощен, особенно код контроллера. Но этого достаточно для понимания ситуации.

Автор: bilbobagginz 18.4.2013, 22:33
в обоих случаях web server тот же ? те же версии ?

Автор: m_maxser 23.4.2013, 06:52
у меня и у разработчика WEBrick, на хостинге - аппач

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)