2016-12-14 2 views
5

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 

Antwort

0

Wenn Sie mit Rails 5:

öffnen bis new_framework_defaults.rb und Änderung:

Rails.application.config.active_record.belongs_to_required_by_default = true 

zu

Rails.application.config.active_record.belongs_to_required_by_default = false 
+0

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 –

Verwandte Themen