Ich übergebe die Fähigkeit, Bilder zuzuschneiden, hochgeladen von Carrierwave. Hier ist RailsCast video on Youtube, dem ich folge.undefinierte Methode `marked_for_destruction? ' CarrierWave, RMagick
Aber nach RMagick in Uploader einschließlich, die ich erhielt:
undefined method `marked_for_destruction?' for #<ImageUploader:0x007fe86634fcf0>
Was für ein Teufel das ist, dachte ich. Ich habe diese Methode nirgends genannt. Aber wenn es nicht definiert ist, können wir es definieren! Und es hat funktioniert! Aber später habe ich mehr über diese Methode überprüft und festgestellt, dass es in Active Record Autosave Association Modul eingebaut ist. Und aus der Dokumentation, über diese Methode:
Gibt zurück, ob dieser Datensatz als Teil der Eltern speichern Transaktion zerstört wird oder nicht.
Nur nützlich, wenn die Option: automatisches Speichern auf dem übergeordneten Element für dieses zugeordnete Modell aktiviert ist.
Aber ich habe autosave: true
an kein Objekt übergeben!
Also, meine erste Frage - war es irgendwie standardmäßig getan?
2 - im RailsCast Tutorial hat er diese Methode nicht definiert. Warum musste ich?
3 - Ich gebe meinen Code weiter. Irgendwelche Fehler?
4 - Könnte jemand erklären, wie dieser Prozess im Allgemeinen funktioniert?
Vielen Dank!
product.rb:
has_one :image
validates :image, presence: true
mount_uploader :image, ImageUploader
products_controller.rb:
def create
@product = Product.new(product_params)
@product.category_id = params[:category_id]
@product.user_id = current_user.id
respond_to do |format|
if @product.save
if params[:product][:image].present?
format.html { render :crop }
else
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
end
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
image_uploader.rb:
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
def marked_for_destruction?
@marked_for_destruction
end
def mark_for_destruction
@marked_for_destruction = true
end
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :large do
resize_to_limit(600,600)
end
end
Danke, könnten Sie Ihre Antwort durch das Schreiben, dass dies, weil Rails5 'belongs_to' erforderlich-Flag auf' true' standardmäßig und wie wird sie verbessern in Bezug auf mein Problem. Ich wette, die Leute werden dafür dankbar sein. Ich arbeite nicht mehr an diesem Projekt, also kann ich das nicht einfach testen –