Ошибка: проверка не удалась: изображения должны существовать, rails-5.0, paperclip-5

Когда я пытался отправить форму, произошла следующая ошибка: Validation failed: Images imageable must exist и сделать то же самое new.html.erb Посмотреть.

Если я прокомментирую file field в new.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

1 ответ

Решение

В рельсах 5, belongs_to удостоверяется, что связанная модель должна существовать. Например, в этой полиморфной ассоциации модель изображения имеет belongs_to :imageable и модель продукта имеет has_many :images, Так что здесь, в new.html.erb мы создаем изображение, но соответствующий продукт не существует, поэтому ошибка Image imageable must exist,

Решение


добавлять optional: true делая ассоциацию belong_to в модели изображения.

Модель изображения теперь выглядит так:

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
Другие вопросы по тегам