2013-03-19 2 views
0

Я пытаюсь настроить условные версии с несущей в моем приложении Rails. Я реализовал то, что кажется точным дубликатом приведенных примеров here.Rails + carrierwave не создает условные версии

Версия никогда не создается, хотя только мой is_ipod? просто возвращает true. Код ниже - это то, что я сейчас имею и не работаю. Обратите внимание на те комментарии, которые я использовал для проверки, что атрибут image_type действительно установлен правильно.

version :ipod_portrait_thumb, :if => :is_ipod? do 

    process resize_to_fit: [150,200] 

end 

def is_ipod? image 
    model.image_type == 'iPod Screenshot' 

    #if (model.image_type == "iPod Screenshot") 
    #if (model.image_type!=nil) 
    #puts "+++++"+model.image_type 
    # if (model.image_type=="iPod Screenshot") 
     #puts "+++++++ I AM HERE" 
    # return true 
    # end 
    #end 
end 

Если is_ipod? выглядит следующим образом:

def is_ipod? image 
    true 
end 

версия создается, как и ожидалось. Что мне не хватает? Благодаря!

UPDATE:

Я редактировал метод is_ipod?, чтобы выглядеть следующим образом:

def is_ipod? image  
    puts (image.path || "") + ': ' + ((model.image_type||"") == 'iPod Screenshot').to_s 
    model.image_type == 'iPod Screenshot' 
end 

, который выводит на консоль:

/public/uploads/tmp/20130325-1024-15906-5363/drawing.png: false 
/public/uploads/tmp/20130325-1024-15906-5363/drawing.png: false 
/public/uploads/app_image/image/59/drawing.png: true 

Таким образом, версия пытается будет создан три раза, дважды для файлов temp и один раз для окончательного файла. Атрибут model устанавливается только для окончательного файла. Связано ли это? Может ли кто-нибудь сказать мне, как это отличается от этого примера?

class MyUploader < CarrierWave::Uploader::Base 

    version :monkey, :if => :is_monkey? 

    protected 

    def is_monkey? picture 
    model.favorite_food == 'banana' 
    end 
end 

Вот мой класс модели в случае, который помогает:

class AppImage < ActiveRecord::Base 
    attr_accessible :app_id, :image, :image_type, :image_cache 
    belongs_to :app 

    mount_uploader :image, AppImageUploader 

    validates :image_type, presence: true 
    validates :image, presence: true 
end 

Спасибо!

+0

, который может звучит как глупый вопрос, но вы на 100% уверены, что когда вы делаете свои тесты, model.image_type равен «iPod Screenshot»? С правильным случаем? Потому что это действительно выглядит как условие 'model.image_type == 'iPod Screenshot'' никогда не выполняется, поэтому ваша версия никогда не создавалась – pjam

+0

Я уверен. Обратите внимание на прокомментированные явные тесты, помещающие «Я ЗДЕСЬ» на консоль. Я проверил это. – kbeal

ответ

1

Оказалось, что это происходит потому, что модель AppImage является дочерним элементом другой модели и добавляется здесь в вложенной форме. По каким-либо причинам дочерние модели не имеют своих атрибутов, установленных по версиям процессов с поддержкой несущей.

Я проверил это, добавив приложения несущей в мою родительскую модель App. Когда версии обрабатываются для вложения App, атрибуты устанавливаются.

Возможно, позже я буду копать глубже, чтобы лучше понять (я довольно новичок в Rails), но пока что я работаю над проблемой, не имея условных версий.

+0

Вы нашли решение! Скрепка имеет ту же проблему, условное изменение размера управляется при обновлении, но во время создания она просто не работает. – geekdeepak

+0

эй, вы решили эту проблему ... У меня тоже такая же проблема с моими вложенными формами. Я не могу решить эту проблему. Если вы решили эту проблему, можете ли вы сообщить мне ... пожалуйста ... – ratnakar

1

У меня была аналогичная проблема ^, и я попытался создать разные размеры в зависимости от атрибута модели. Мое решение просто: просто заново создайте версии после сохранения.

приложение/закачивающие/project_item_picture_uploader.rb

class ProjectItemPictureUploader < CarrierWave::Uploader::Base 

    ... 

    version :preview do 
    process dynamic_process: true 
    end 

    protected 

    def dynamic_process(*args) 
    resize_to_fill *(model.get_size) if model.persisted? 
    end 

end 

приложение/модель/project_item.Р.Б.

class ProjectItem < ActiveRecord::Base 
    mount_uploader :picture, ProjectItemPictureUploader 
    validates_presence_of :picture 

    def get_size 
    double ? [168, 57] : [76, 57] 
    end 

    after_save :recreate_delayed_versions! 
    def recreate_delayed_versions! 
    picture.recreate_versions! 
    end 
end 
1

У меня есть один и тот же вопрос в эту ночь, и я делаю некоторые эксперименты с ним, в конце концов я понял, это, кажется, что, когда ваш создать версию впервые (когда вы размещаете свою форму), если у вас есть эта строка:

model.image_type == 'iPod Screenshot' 

это означает, что вы должны обязательно есть поле в вашей форме имени image_type и значение этого поля должно быть «IPOD Screenshot»

CarrierWave проверить са мне, что, когда вы показываете изображение как article.image_url(:ipod_portrait_thumb) это означает, что вы должны иметь в вашей базе данных поле имени image_type со значением «IPOD Скриншот»

так что если у вас есть эта строка:

version :ipod_portrait_thumb, :if => :is_ipod? 

вы говорите CarrierWave для выполнения ipod_portrait_thumb работать каждый раз, когда вы Создать или Показать запись

в том случае, если форма не содержит field image_type со значением «IPOD Screenshot», например, потому что вы установите его в модели/регуляторе, способ это проверить еще одно поле, чтобы разрешить CarrierWave создать условную версию, так что это просто вы можете сделать что-то вроде этого:

model.image_type == 'iPod Screenshot' || another_field_in_my_form_help_you_to_know_type_is_ipode == "something" # or just .present? rather than == "something" switch your case 

здесь, когда CarrierWave пытаются создать версию в первый раз, он будет проверять этот another_field _.... .., и если у вас есть страницы, которые показывают свою запись (продукт, статьи ....) это проверить model.image_type == 'iPod Screenshot', которая хранится уже в вашей базе данных

Надеется, что это поможет вам :)

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