2016-07-26 18 views
11

フォームを送信しようとしたときにエラーが発生しました。Validation failed: Images imageable must existと同じnew.html.erbビューを表示します。エラー:検証に失敗しました:imageableイメージが存在する必要があります。rails-5.0、paperclip-5

私はfile fieldnew.html.erbにコメントしています。製品が正常に作成されています。

ProductsController:


def new 
    @product = Product.new 
end 

def create 
    @product = Product.create!(product_params) 

    if @product.save 
     redirect_to products_path, notice: "Product Created Successfully" 
    else 
     render "new" 
    end 
end 
def product_params 
     params.require(:product).permit(:name, :quantity, :price, images_attributes: [:id, :photo, :_destroy]) 
end 

new.html.erb:


<%= nested_form_for @product, html: { multipart: true } do |f|%> 

    <h2>New</h2> 

    <P> <%= f.label :name %> <%= f.text_field :name %> </P> 
    <P> <%= f.label :quantity %> <%= f.text_field :quantity %> </P> 
    <P> <%= f.label :price %> <%= f.text_field :price %> </P> 
    <%= f.fields_for :images do |p| %> 
    <p> <%= p.label :photo %> <%= p.file_field :photo %> </p> 
    <%= p.link_to_remove "Remove Image" %> 
    <% end %> 
    <%= f.link_to_add "Add Image", :images %> 

    <%= f.submit "Add Product" %> 
<% end %> 

20160725102038_add_image_columns_to_imageable.rb:


class AddImageColumnsToImageable < ActiveRecord::Migration[5.0] 

    def up 
    add_attachment :images, :photo 
    end 

    def down 
    remove_attachment :images, :photo 
    end 

end 

モデル:product.rb


class Product < ApplicationRecord 
    has_one :variant 
    has_many :images, as: :imageable, dependent: :destroy 

    accepts_nested_attributes_for :images, allow_destroy: true 
end 

モデル:image.rb


class Image < ApplicationRecord 
    belongs_to :imageable, polymorphic: true 

    has_attached_file :photo, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png" 
    validates_attachment :photo, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] } 

end 

答えて

24

レール5では、belongs_toは関連するモデルが存在する必要があることを確認します。 例:この多型関連では、画像モデルはbelongs_to :imageableで、製品モデルはhas_many :imagesです。 ここではnew.html.erbに画像を作成していますが、それぞれの製品が存在しないため、エラーImage imageable must existです。

ソリューション


イメージ・モデルにbelong_toの関連付けを行いながらoptional: trueを追加します。

class Image < ApplicationRecord 
    belongs_to :imageable, polymorphic: true, optional: true 

    has_attached_file :photo, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png" 
    validates_attachment :photo, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] } 

end 

画像のモデルは今のようになります。

関連する問題