Многообразная модель нового действия
У меня есть модель под названием 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])
а также nonsense
accepts_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
...