0

そのため、キャリアウェーブのアップロード画像を介してCloudinaryに直接アップロードし、それらを正しく関連付けていますが、作成された後は更新または破棄できないようです。

更新すると、画像がアップロードされ、ダッシュボードから利用できるようになりますが、関連するレコードは変更されず、常に元の画像が表示されます。

画像を破棄しようとすると、次のエラーCouldn't find Image with ID=1 for Finish with ID=11が表示Finishされます。親モデルと画像フィールドはネストされています。さらに、Imageモードは多態的です。非表示の入力が20のときに画像IDが「1」であると考える理由がわかりません。

私が間違っていることはありますか?

生成されたフォームは次のとおりです (投稿すると便利なコードが他にある場合は、お知らせください)。

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

編集:より多くのコードが要求されました

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

仕上げ.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

finish_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
4

1 に答える 1

0

これは Cloudinary の問題ではないことが判明しました。

update1) ordestroyメソッドを持っていなかったため、画像が更新されませんでしたimages_controller(doh!)

2)Couldn't find Image with ID=1 for Finish with ID=11非表示のフィールドを削除するようにマークした JS が誤って構成され、すべての非表示のフィールドの値が変更されたため、エラーが発生しました。変更されていないため、以前は機能していた理由はわかりませんが。

于 2013-08-11T17:40:19.940 に答える