【问题标题】:Rails - Multiple photos with paperclip...what's wrong with this idea?Rails - 带有回形针的多张照片......这个想法有什么问题?
【发布时间】:2015-07-25 00:42:04
【问题描述】:

我目前正在使用回形针和 imagemagick 为我的文章上传一张照片。我一直在寻找添加多张照片的方法。我不需要无限的照片,实际上我想将其限制为每篇文章 8 张。所以这让我开始思考,仅仅拥有 8 个单独的附件有什么问题?是的,这意味着在路由表中有 8 个单独的方法、8 个单独的行等等……但那又如何呢?我有一个非常低容量的网站,所以除了臃肿的代码之外,还有什么理由不这样做吗?我已经用 2 张照片对其进行了测试,它似乎工作得很好。事实上,它似乎使事情变得更容易,因为您不需要考虑特定照片的“id”来使其出现在文章中的特定位置。

不管怎样,每张照片都有一条如下所示的路线:

 get 'article/:id/remove_photo', to: 'articles#remove_photo', as: 'remove_article_photo'

我的模型中的语句如下所示:

has_attached_file :photo , :styles => { :small => '200>', :medium => '400>', :large => '600>' }
 validates_attachment :photo, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }
  validates_attachment :photo, :less_than => 1.megabytes

需要有一个单独的方法来删除控制器中的每张照片:

def remove_photo 
@article = Article.find(params[:id])
@article.photo = nil
@article.save
redirect_to @article
end

是的,它有很多代码,但也很容易理解。而且我比驴还笨,所以这很有帮助。 :D 任何输入将不胜感激。

【问题讨论】:

    标签: ruby-on-rails paperclip


    【解决方案1】:

    老实说,让您了解为什么它不是最佳策略的最佳方法是您去实际实施它——我觉得您很快就会知道为什么!但是,要实际回答您的问题,您的解决方案的主要缺陷是:

    • 增加的维护成本——假设您想为您的图像支持一种新的文件类型。你需要在八个地方改变它,而不仅仅是一个。 (这可以通过将大的配置哈希提取到常量或配置文件中来缓解,这是减少重复的静态数据的有效策略)。
    • 无法以类似列表的方式处理您的类似列表的数据——因为您的照片现在存在于photo1photo2photo3 等,您如何快速告诉我有多少照片上的文章?您如何按标题对照片进行排序?
    • 令人讨厌的代码 -- 如果你是唯一的开发人员,也许现在这无关紧要......但最终即使你回头看它也会感到痛苦!

    正式地,您提出的建议称为denormalization。在某些情况下,这是合理的 - 非规范化数据通常可以更快地访问,并且可以更轻松地提供某些限制(例如您希望每篇文章只允许八张照片)。

    如果您正在处理更类似于哈希的数据集,那肯定是有意义的——例如,side_photo vs main_photo vs author_photo。不过,由于您的照片只是一个列表,我建议在您的数据库中创建一个照片模型,并将回形针引用附加到该模型(不是文章)。

    无论如何,您的数据模型由您决定!如果您最终确实对列进行了非规范化,让我留给您一些元编程,这将使您的生活更轻松:

    def remove_photo
      @article = Article.find(params[:id])
      @article.send("photo#{params[:photo_id].to_i}=", nil)
      @article.save
      redirect_to @article
    end
    

    Ruby 中的send 方法动态调用对象上的方法,我在上面使用该方法来子photo_id 参数。因此,您只需要一条路线,匹配 DELETE articles/:id/photos/:photo_id,并使用该操作来处理您的所有 photoX 列。

    【讨论】:

    • 罗伯特,感谢您如此深入的回答!很好的指导。
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多