2

У меня есть модель продукта и модель изображения (на основе скрепки).Полиморфная ассоциация и вложенные атрибуты

class Product < ActiveRecord::Base 
    has_many :images, as: :imageable, 
        dependent: :destroy 
    accepts_nested_attributes_for :images 
end 

class Image < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 
    has_attached_file :picture 
end 

Я хочу, чтобы добавить изображение для моих продуктов в одной и той же странице я создаю продукт (/products/new). Вот форма:

<%= form_for(@product, html: { multipart: true}) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div> 
    <%= f.label :name, t('product.name') %> 
    <%= f.text_field :name %> 
    </div>      
    <div class="file_field"> 
    <%= f.fields_for :image do |images_form| %> 
     <%= images_form.file_field :image %> 
    <% end %> 
    </div> 
    <%= f.submit @submit_button %> 
<% end %> 

Тогда я иду к /products/new странице, я заполнить поля и нажмите на кнопку отправки. Сервер пытается отобразить страницу показа продукта, но она не работает, потому что изображение не было сохранено. У меня есть следующее сообщение об ошибке:

undefined method `picture' for nil:NilClass 

в следующей строке в шоу-странице продукта

image_tag(@product.images.first.picture.url(:medium)) 

Интересно, почему изображение не сохранено, и я вижу, что сервер делает следующее сообщение:

Unpermitted parameters: images_attributes 

Поэтому я добавил атрибуты изображения в разрешении продуктов Params (like there):

def product_params 
    params.require(:product).permit(:name, :sharable, :givable, image_attributes: [:name, :picture_file_name, :picture_content_type, :picture_file_size]) 
end 

Но это ничего не меняет, у меня всегда такое же сообщение об ошибке. У вас есть идея, откуда возникает проблема разрешения?

+1

'params.require (: продукт) .permit (: имя,: совместно используемых,: givable, image_attributes: [: name:: picture_file_name,: picture_content_type,: picture_file_size]) 'to' params.require (: product) .permit (: name,: sharable,: givable,: image) ' –

ответ

4

Вы, возможно, потребуется изменить

params.require(:product).permit(:name, :sharable, :givable, image_attributes: [:name, :picture_file_name, :picture_content_type, :picture_file_size]) 

в

params.require(:product).permit(:name, :sharable, :givable, images_attributes: [:name, :picture]) 
+0

ОК, это сработало! Очень глупая ошибка ... Спасибо! –

+0

Приветствия, рады помочь – NicoArbogast

+0

О нет! Я ошибся. Когда я перезапустил сервер, страница показа продукта выглядела неплохо, но изображение больше не сохранялось. '# <Идентификатор изображения: 3, имя: nil, imageable_id: 249, imageable_type:« Продукт », picture_file_name: nil, picture_content_type: nil, picture_file_size: nil, picture_updated_at: nil, created_at:" 2013-08-25 13:48: 56 ", updated_at:" 2013-08-25 13:48:56 ">]>' –

1

Вы определяете has_many ассоциации, так, по вашему мнению, он должен быть f.fields_for: изображения

<%= f.fields_for :images do |images_form| %> 
    <div class="file_field">   
     <%= images_form.file_field :picture %>   
    </div> 
<% end %> 

В контроллере, вы должны построить некоторые изображения первым и добавьте images_attributes к разрешенным параметрам.

@product = Product.new 
3.times {@product.images.build} 

В вашем представлении отобразятся 3 поля.

+0

Это не работает, у меня всегда есть" Непредвиденные параметры: images_attributes ". –

+0

вам нужно изменить image_attributes на images_attributes – Bigxiang

0

Любой шанс это должен сделать с вашим file_field быть

<%= images_form.file_field :image %> 

вместо следующего?

<%= images_form.file_field :picture %> 
+0

Это не работает, у меня всегда есть сообщение «Непредставленные параметры: images_attributes». –

+0

Flo Rahl, Не могли бы вы добавить точное сообщение об ошибке на свой вопрос? – NicoArbogast

+0

ОК, я обновил свой пост, чтобы сделать его более понятным. –

Смежные вопросы