0
votes

So I have Cloudinary direct upload via Carrier wave uploading images and associating them correctly, however I can't seem to update or destroy them once they have been created.

When updating, the image is uploaded and is available via my dashboard, however the associated record never changes and I always see the original image.

When attempting to destroy the image I get the the error: Couldn't find Image with ID=1 for Finish with ID=11 where Finish is the parent model and image fields are nested. Additionally the Image mode is polymorphic. I'm not sure why it thinks the image id is "1" when the hidden input has it as 20.

Any ideas what I'm doing wrong?

Here is the generated form (if there is any other code that would be useful to post please let me know):

<form accept-charset="UTF-8" action="/finishes/11" class="edit_finish" enctype="multipart/form-data" id="edit_finish_11" method="post">
  <div style="margin:0;padding:0;display:inline">
    <input name="utf8" value="✓" type="hidden">
    <input name="_method" value="put" type="hidden">
    <input name="authenticity_token" value="xxx=" type="hidden">
  </div>
  <fieldset id="finishes">
    <legend>
      Finish
    </legend>
    <div class="active">
      <div class="field">
        <label for="finish_title">Title</label>
        <input id="finish_title" name="finish[title]" size="30" value="Eggshell White" type="text">
      </div>
      <div class="singular-addable" id="finish-image-92807">
        <div class="addable-group images">
          <div class="image-field-group">
            <div class="field">
              <label for="finish_image_attributes_0_asset">Image</label>
              <input class="cloudinary-fileupload" data-cloudinary-field="finish[image_attributes][0][asset]" data-form-data="{'timestamp':1375824622,'callback':'http://localhost:8080/cloudinary_cors.html','signature':'xxx','api_key':'xxx'}" data-url="https://api.cloudinary.com/v1_1/hmnxgsjti/auto/upload" name="file" type="file">
            </div>
            <div class="image-box">
              <img alt="v1375727159/owybb0xaxdlhgfyvwtwx.jpg" src="http://res.cloudinary.com/hmnxgsjti/image/upload/t_hint/v1375727159/owybb0xaxdlhgfyvwtwx.jpg">
            </div>
            <div class="remove-fields">
              <input class="destroy" id="finish_image_attributes_0__destroy" name="finish[image_attributes][0][_destroy]" value="false" type="hidden"><a href="#" class="remove"><i class="icon-remove-circle icon-large" title="Remove"></i></a>
            </div>
          </div>
          <input id="finish_image_attributes_0_id" name="finish[image_attributes][0][id]" value="20" type="hidden">
        </div>
      </div>
    </div>
  </fieldset>
  <div class="actions">
    <input name="commit" value="Save" type="submit">
  </div>
</form>

EDIT: More code requested

image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  include Cloudinary::CarrierWave

  def extension_white_list
    %w(jpg jpeg gif png)
  end
end

image.rb

class Image < ActiveRecord::Base
  default_scope order('images.id ASC')

  attr_accessible               :asset,
                                :asset_cache

  belongs_to                    :imageable, polymorphic: true

  mount_uploader                :asset, ImageUploader
end

finish.rb

class Finish < ActiveRecord::Base
  default_scope order('finishes.title ASC')
  attr_accessible               :name,
                                :title,

                                ## belongs_to ##

                                ## has_many ##
                                :sku_ids,
                                :compilation_ids,

                                ## nested attributes ##
                                :image_attributes


  has_many                      :skus
  has_many                      :compilations

  has_many                      :image, as: :imageable, :dependent => :destroy
  accepts_nested_attributes_for :image, reject_if: proc { |attrs| attrs['asset'].blank? && attrs['asset_cache'].blank? }, allow_destroy: true

  validates_presence_of         :image
  validates_presence_of         :title

  before_save                   :create_name

  def self.skus(finish_id = :id)
    @skus = Sku.where(:finish_id => finish_id)
    return @skus
  end

  private

  def create_name
    self.name = title.parameterize
  end
end

finishes_controller.rb

class FinishesController < ApplicationController
  # Ajax Routes
  def skus
    @skus = Finish.skus(params[:id])
    render "skus/_list", locals: { type: params[:type] }, layout: false
  end

  # REST Routes
  def index
    @finishes = Finish.all

    respond_to do |format|
      format.html
      format.json { render json: @finishes }
    end
  end

  def show
    @product_ids = Product.skus_by_finish(params[:id]).map{|sku| sku.product_id}
    @products = Product.where(:id => @product_ids).order(:name)

    render "layouts/templates/list"
  end

  def new
    @finish = Finish.new

    @finish.image.build

    respond_to do |format|
      format.html 
      format.json { render json: @finish }
    end
  end

  def edit
    @finish = Finish.find(params[:id])
  end

  def create
    @finish = Finish.new(params[:finish])

    respond_to do |format|
      if @finish.save
        format.html { redirect_to finishes_path, notice: 'Finish was successfully created.' }
        format.json { render json: finishes_url, status: :created, location: @finish }
      else
        format.html { render action: "new" }
        format.json { render json: @finish.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    @finish = Finish.find(params[:id])

    respond_to do |format|
      if @finish.update_attributes(params[:finish])
        format.html { redirect_to finishes_url, notice: 'Finish was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @finish.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @finish = Finish.find(params[:id])
    @finish.destroy

    respond_to do |format|
      format.html { redirect_to finishes_url }
      format.json { head :no_content }
    end
  end
end
1

1 Answers

0
votes

This turned out to not be a Cloudinary issue at all.

1) The images were not updating because I didn't have an update or destroy method in my images_controller (doh!)

2) I was getting the Couldn't find Image with ID=1 for Finish with ID=11 errors because my JS that marked the hidden fileds for deletion was misconfigured and changed the value for all hidden fields. Though I don't know why it used to work as it hasn't changed.