2016-02-10 2 views
0

У меня есть приложение Rails (4), и я использую несущую для загрузки изображения в ведро S3 на производстве (и локальное в dev). Это все работает, но я хотел реорганизовать свой код.метод рефакторирования метод multi mount_uploader для несущей волны

Моя модель:

class Blogging < ActiveRecord::Base 

mount_uploader :picture1, Picture1Uploader 
mount_uploader :picture2, Picture1Uploader 
mount_uploader :picture3, Picture1Uploader  
mount_uploader :picture4, Picture1Uploader 
mount_uploader :picture5, Picture1Uploader 
mount_uploader :picture6, Picture1Uploader 
mount_uploader :picture7, Picture1Uploader 
mount_uploader :picture8, Picture1Uploader 
mount_uploader :picture9, Picture1Uploader 
mount_uploader :picture10, Picture1Uploader 
mount_uploader :picture11, Picture1Uploader 
validate :picture_size 


private 
    def picture_size 
    if picture1.size > 5.megabytes 
     errors.add(:picture1, "should be less than 5 MB") 
    end 
    end 


end 

Через некоторое рефакторинга, у меня есть это:

class Blogging < ActiveRecord::Base 


for i in 1..11 
mount_uploader :"picture#{i}", Picture1Uploader 
end 


validate :picture_size 
validates :picture1, :news_title, :news_body, presence: true 



private 

def picture_size 
    pics = Array.new(11) {|i| "picture#{i+1}"} 
     pics.each do |p| 
     if p.size > 5.megabytes 
     errors.add(:picture1, "should be less than 5 MB") 
     end 
    end 
end 
end 

mount_uploader, а уродливый отлично работает. Но я не могу найти способ сделать picture_size ограничивать размер каждого изображения (от 1 до 11).

  • Я могу заставить его работать с использованием 11 раз другого метода или с оператором case. Но я пытаюсь реорганизовать.

  • Я бы с удовольствием применил цикл «для» в методе и назвал его, но не могу понять, как это сделать. если я определить метод и называют его все изображение исчезают, и файл не получают загружен (локально или на ведро S3)

ответ

1

Попробуйте это:

def picture_size 
    pics = Array.new(11) {|i| "picture#{i+1}"}.each do |pic_name| 
    p = self.send pic_name 
    if p.size > 5.megabytes 
     self.errors.add(:picture1, "should be less than 5 MB") 
    end 
    end 
end 
+0

он работает, но не для сообщения об ошибке: 'def picture_size' \t' pics = Array.new (11) {| i | "picture # {i + 1}"}. each do | pic_name | ' \t \t' р = self.send pic_name ' \t \t', если P.SIZE> 5.megabytes' \t \t \t 'errors.add (: picture1, "должно быть не менее 5 МБ")' \t \t 'end' \t \t' end' \t 'end' с каким репаратором: picture1? – bobix

+0

См. Править выше. 'self.errors.add' должен исправить это –

+0

Работы Я просто заменил picture1 на: 'self.errors.add (pic_name,« должно быть меньше 5 МБ »)' Спасибо – bobix

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