2013-09-03 4 views
4

Я новичок в рельсах. В настоящее время я устанавливаю Paperclip для модели в Rails 3. Когда одно из полей формы терпит неудачу, оно не перезагружает загруженное изображение снова. Оно запрашивает у пользователя новую новость. Он не выглядит удобным для пользователя.Перезагрузка файла при загрузке файла при загрузке при завершении проверки

Я хотел бы сделать две вещи, чтобы решить эту проблему. Если все поля заполнены правильно, я хотел бы сохранить их в своем приложении (в системной папке, как это обычно делается с помощью paperclip). Если поля не проходят проверку, захотите временно сохранить изображение в отдельной папке, пока оно не будет сохранено.

Я иду по правому пути? Else есть простой способ сделать это?

ответ

1

К сожалению, Paperclip сохраняет загруженный файл только при успешном сохранении модели, содержащей файл.

Я считаю, что самый простой вариант - сделать валидацию на стороне клиента с помощью javascript, поэтому нет необходимости в полной конфигурации/взломе.

0

Мне пришлось исправить это в недавнем проекте. Это немного хаки, но это работает. Я пробовал вызывать cache_images(), используя after_validation и before_save в модели, но он не удается создать по какой-то причине, что я не могу определить, поэтому я просто вызываю его из контроллера. Надеюсь, это поможет кому-то еще некоторое время!

Модель:

class Shop < ActiveRecord::Base  
    attr_accessor :logo_cache 

    has_attached_file :logo 

    def cache_images 
    if logo.staged? 
     if invalid? 
     FileUtils.cp(logo.queued_for_write[:original].path, logo.path(:original)) 
     @logo_cache = encrypt(logo.path(:original)) 
     end 
    else 
     if @logo_cache.present? 
     File.open(decrypt(@logo_cache)) {|f| assign_attributes(logo: f)} 
     end 
    end 
    end 

    private 

    def decrypt(data) 
    return '' unless data.present? 
    cipher = build_cipher(:decrypt, 'mypassword') 
    cipher.update(Base64.urlsafe_decode64(data).unpack('m')[0]) + cipher.final 
    end 

    def encrypt(data) 
    return '' unless data.present? 
    cipher = build_cipher(:encrypt, 'mypassword') 
    Base64.urlsafe_encode64([cipher.update(data) + cipher.final].pack('m')) 
    end 

    def build_cipher(type, password) 
    cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC').send(type) 
    cipher.pkcs5_keyivgen(password) 
    cipher 
    end 

end 

Контроллер:

def create 
    @shop = Shop.new(shop_params) 
    @shop.user = current_user 
    @shop.cache_images 

    if @shop.save 
    redirect_to account_path, notice: 'Shop created!' 
    else 
    render :new 
    end 
end 

def update 
    @shop = current_user.shop 
    @shop.assign_attributes(shop_params) 
    @shop.cache_images 

    if @shop.save 
    redirect_to account_path, notice: 'Shop updated.' 
    else 
    render :edit 
    end 
end 

вид:

= f.file_field :logo 
= f.hidden_field :logo_cache 

- if @shop.logo.file? 
    %img{src: @shop.logo.url, alt: ''} 
Смежные вопросы