【问题标题】:refactor model method multiple mount_uploader for carrierwave为carrierwave重构模型方法multiple mount_uploader
【发布时间】:2026-01-21 15:00:01
【问题描述】:

我有 Rails (4) 应用程序,我正在使用 carrierwave 将图像上传到生产中的 S3 存储桶(以及开发中的本地存储桶)。一切正常,但我想重构我的代码。

我的模特:

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 次不同的方法或使用案例运算符使其工作。但我正在尝试重构。

  • 我很想将我的“for”循环放在一个方法中并调用它,但不知道怎么做。如果我定义一个方法并调用它,所有图像都会消失并且没有文件上传(本地或在 S3 存储桶上)

【问题讨论】:

    标签: ruby-on-rails model refactoring carrierwave


    【解决方案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
    

    【讨论】:

    • 它正在工作,但不适用于错误消息:def picture_sizepics = Array.new(11) {|i| "picture#{i+1}"}.each do |pic_name| p = self.send pic_name if p.size &gt; 5.megabyteserrors.add(:picture1, "should be less than 5 MB")endend end 我重构了什么:picture1?跨度>
    • 我刚刚将图片1 替换为:self.errors.add(pic_name, "should be less than 5 MB") 谢谢