2016-07-26 12 views
11

Podczas próby przesłania formularza wystąpił następujący błąd: Validation failed: Images imageable must exist i renderować ten sam widok new.html.erb.Błąd: Sprawdzanie poprawności nie powiodło się: obrazy do odtworzenia muszą istnieć, rails-5.0, spinacz-5

Jeśli komentarz file field w new.html.erb. Produkt jest tworzony pomyślnie.

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 

Model: product.rb


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

    accepts_nested_attributes_for :images, allow_destroy: true 
end 

Model: 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 

Odpowiedz

24

W szynach 5, belongs_to zapewnia, że ​​powiązany model musi istnieć. E.g W tym skojarzeniu polimorficznym model obrazu ma wartość belongs_to :imageable, a model produktu ma wartość has_many :images. Tak więc tutaj w new.html.erb tworzymy obraz, ale odpowiedni produkt nie istnieje, dlatego właśnie błąd Image imageable must exist.

Rozwiązanie


Dodaj optional: true jednocześnie stowarzyszenie belong_to w modelu obrazu.

modela teraz wygląda:

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 
Powiązane problemy