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