Как инициализировать модель ActiveRecord ДО того, как данные формы будут обработаны путем вызова params [: model]? - PullRequest
0 голосов
/ 08 августа 2011

Предполагая следующую модель:

class Model < ActiveRecord::Base
 def initialize(*args)
  super
  self.du = 1000
 end

 def duration=(val)
  self.du = val
 end

 def duration_day
  (du / (60 * 60 * 24)).floor
 end

 def duration_day=(val)
  duration_tmp = duration_day - val
  self.duration = duration_tmp
 end
end

Атрибут "du" сохраняется в базе данных. Я хочу инициализировать "du", когда создается новый экземпляр Model, чтобы заполнить элемент формы с именем "duration_day". Это работает до сих пор.

Тем не менее, когда форма отправлена, и значение, указанное пользователем для «duration_day», распространяется в новый экземпляр Model контроллером, как обычно:

def create
  @model = Model.new
  @model = Model.new(params[:model])
end

..., я получаю NoMethodError неопределенный метод `/ 'для nil: NilClass , потому что атрибут" du "не был инициализирован в это время, потому что" super "вызывается перед фактической инициализацией. Удаление «super» или перемещение его вниз в рамках метода «initialize» вызывает другие ошибки.

Есть ли шанс заставить это работать?

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Если вы хотите инициализировать модель, а затем передать атрибуты без повторной инициализации, вы можете сделать это:

@model = Model.new
@model.attributes = params[:model]

Однако вы все равно можете столкнуться с проблемой, используя значение по умолчанию:du = 1000 когда он достигает ваших методов duration= и duration_day= в зависимости от порядка, ActiveRecord анализирует ваши параметры.

0 голосов
/ 01 мая 2014

Когда вы вызываете super без аргументов, он передает ему аргументы инициализации.Для правильной инициализации используйте super():

 def initialize(*args)
  super()
  self.du = 1000
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...