Работа с вложенными объектами требует небольшой работы, но это не так сложно.Начиная с Rails 2.3, существует понятие «вложенные атрибуты» и «формы вложенных объектов» (см .: http://guides.rubyonrails.org/2_3_release_notes.html#nested-attributes и http://guides.rubyonrails.org/2_3_release_notes.html#nested-object-forms).
В основном это позволяет вам делать что-то вроде этого:
<% form_for @recipe do |f| %>
<%= f.text_field :name %>
<%= f.text_field :description %>
<% f.fields_for :video do |v| %>
<%= v.text_field :link %>
<% end %>
<% end %>
Как вы видите, код сообщает форме, что в рецепте есть fields_for a: video объект. Затем вы можете изменить свой рецепт следующим образом:
class Recipe < ActiveRecord::Base
has_one :video
accepts_nested_attributes_for :video
end
ThisКод сообщает ActiveRecord, что вы можете передать атрибуты для видеообъекта вместе с рецептом. Так что теперь все, что вам нужно сделать, это ...
Recipe.create(params[:recipe])
... и он создаст рецепт ивидеозаписи, так как ваша форма содержит видеоинформацию и класс Recipe accepts_nested_attributes_for: video.
-
Просто чтобы прояснить пару вещей о вашем коде. Вы передаете в параметрах [: link] to Video.new. Video.new не ожидает строку, он ожидает хэш атрибутов. Итак, вы звоните ...
Video.new("example.com/video_file.mp4")
... когда вы действительно хотите бытьпроходя в..
Video.new(:link => "example.com/video_file.mp4")
без бПомимо хэша, ActiveRecord не знает, какой атрибут вы пытаетесь установить с помощью «new».Вы могли бы также сделать.,.
v = Video.new
v.link = params[:link]
.,,и установить атрибут таким образом.Кроме того, в зависимости от того, что еще было в контроллере, вы, возможно, не назначаете recipe_id для видео и не можете звонить @ video.save.Иногда из-за крутости ActiveRecord кажется, что таких вещей не должно быть - и если вы используете что-то вроде acceptpts_nested_attributes_, вам не нужно делать такие вещи.Однако, если вы хотите сделать это вручную, вы должны обязательно сохранить их все, назначить ассоциации, проверить оба объекта на наличие ошибок и управлять транзакцией.
-
Документация Rails по этому вопросу неплохая и включает в себя многое из этого: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
Райан Дейгл также имеет хороший пост в блоге: http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes