2016-12-14 3 views
5

Я передаю возможность обрезать изображения, загруженные Carrierwave. Вот RailsCast video on Youtube, за которым я следую.неопределенный метод `отмеченный_for_destruction? ' CarrierWave, RMagick

Но после включения RMagick в пользователе, я получил:

undefined method `marked_for_destruction?' for #<ImageUploader:0x007fe86634fcf0> 

Что щеколда это я думал. Я не называл этот метод нигде. Но если он не определен, давайте его определим! И это сработало! Но позже я проверил больше об этом методе и обнаружил, что он встроен в Модуль Active Record Autosave. И из документов, об этом методе:

Возвращает, будет ли эта запись уничтожена как часть родителей .

Только полезно, если: для модели включена опция autosave для родительского элемента.

Но я не прошел autosave: true на любой объект!

Итак, мой первый вопрос - как это было сделано по умолчанию?

2 - в руководстве RailsCast он не определил этот метод. Почему я должен был?

3 - Передаю код ниже. Любые ошибки?

4 - если возможно, может кто-нибудь объяснить, как этот процесс работает, в общем?

Большое спасибо!

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 

ответ

0

Если вы используете Rails 5:

Open вверх new_framework_defaults.rb и изменение:

Rails.application.config.active_record.belongs_to_required_by_default = true 

в

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

Спасибо, вы могли бы улучшить свой ответ, написав, что это происходит потому, что Rails5 'belongs_to' требуется флаг установлен в' true' по умолчанию, и как это связано с мой вопрос. Бьюсь об заклад, люди будут благодарны за это. Я больше не работаю над этим проектом, поэтому не могу проверить это легко –

Смежные вопросы