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:[:名稱,:picture_file_name,:picture_content_type,:picture_file_size])''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

哦不!我錯了。當我重新啓動服務器時,產品的顯示頁面呈現良好,但圖像不再保存。 '#]>' –

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

好吧,我更新了我的帖子,使其更容易理解。 –