Многообразная модель нового действия

У меня есть модель под названием Nonsense который имеет_один из Foo а также Bar

В моем контроллере для Nonsense Мне нужно создать соответствующие записи для Foo а также Bar

Причина, по которой я должен создать те, которые мне нужны, чтобы показать ссылки на Foo а также Bar в new действие, из-за характера заявки детали для Nonsense не может быть известно до Foo а также Bar были заполнены.

Что я пытаюсь сделать в новом действии для Nonsense это

def new
  @nonsense = Nonsense.new
  @nonsense.bar = Bar.new
  @nonsense.foo = Foo.new
...

Теперь проблема, с которой я сталкиваюсь, заключается в том, что в show вид, что помощник пути будет жаловаться на идентификатор для @nonsense.foo а также @nonsense.bar ноль.

В представлении шоу я просто делаю @nonsense = Nonsense.find(params[:id]) а также nonsenseaccepts_nested_attributes_for :foo, :bar

Есть идеи, почему это произойдет?

1 ответ

Решение

Я не думаю, что Bar.new фактически создает объект в базе данных, поэтому идентификатор на самом деле все еще равен нулю. Если вам нужна ссылка на эти объекты, вам сначала нужно сохранить их.

Можете ли вы сохранить их с некоторыми деталями по умолчанию? Я не очень много использовал рельсы, но я думаю, что вы должны быть осторожны, чтобы очистить их, если вы в конечном итоге не совершите ерунду. Что еще более важно, я подозреваю, что ваш рабочий процесс и / или модель данных должны быть исправлены, но, возможно, я просто не знаком с более сложными настройками рельсов.

Наконец, если все эти вещи являются зависимыми и являются частью вашей логики модели, то вам, вероятно, следует создавать эти объекты в бессмысленной модели и присоединять все, что нужно контроллеру. В противном случае вы позволяете логике вашей модели проникать в контроллер.

Чтобы быть более явным (я уверен, что это плохая форма рельсов, кстати, даже если это работает):

def new
  @nonsense = Nonsense.new

  @nonsense.bar = Bar.new
  @nonsense.bar.any_necessary_attributes = some_value
  @nonsense.bar.save

  @nonsense.foo = Foo.new
  @nonsense.foo.any_necessary_attributes = some_value
  @nonsense.foo.save
...
Другие вопросы по тегам