внешний ключ удален на новый / сборка - PullRequest
0 голосов
/ 29 января 2011

надеюсь, кто-то может помочь мне понять, почему это происходит. Я установил следующие экземпляры ...

@product = Product.find(params[:id])
@new_image = @product.images.new

при отладке @new_image правильно установлен внешний ключ.

--- !ruby/object:Image 
        attributes: 
          product_id: 1

однако при сохранении product_id не был установлен. вот когда я заметил, что и в этой отладочной информации это было ...

changed_attributes: 
  product_id: 

в основном обнуляет мой внешний ключ. То же самое, если я использую сборку. почему этот экземпляр не держит внешний ключ?

UPDATE: чтобы упростить ситуацию, даже если я просто выведу debug Product.find(1).images.new на мой взгляд, я получу:

!ruby/object:ProductImage 
        attributes: 
          created_at: 
          product_id: 1
          updated_at: 
        attributes_cache: {}

        changed_attributes: 
          product_id: 
        destroyed: false
        marked_for_destruction: false
        new_record: true
        previously_changed: {}

        readonly: false

1 Ответ

0 голосов
/ 29 января 2011

Насколько я понимаю, представление show вашего продукта содержит форму для отправки на контроллер images. Когда вы создаете переменную @new_image на основе @product в своем представлении, оно правильно присвоило product_id изображению. Однако это НЕ сохраняется, когда вы публикуете форму.

У вас есть два варианта. Проще всего было бы просто добавить элемент <%= f.hidden_field :product_id %> в вашу форму, таким образом, product_id будет отправлен на Image#create. В качестве альтернативы, вы можете создать вложенный ресурс и сделать <%= form_for [@product, @new_image] do |f| %> вместо <%= form_for @new_image %>, который вы, вероятно, используете сейчас, а затем в вашем методе create выполните:

@product = Product.find(params[:product_id])
@new_image = @product.images.new(params[:image])
...