Многообразная модель нового действия - PullRequest
1 голос
/ 01 февраля 2012

У меня есть модель с именем 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 Ответ

0 голосов
/ 01 февраля 2012

Я не думаю, что 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
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...