Rails - 带回形针的多张照片......这个想法出了什么问题?

时间:2015-07-25 00:42:05

标签: ruby-on-rails paperclip

我目前正在使用paperclip和imagemagick为我的文章上传一张照片。我一直在四处寻找添加多张照片的方法。我不需要无限量的照片,事实上我想将它限制为每篇文章8张。这让我思考,简单地拥有8个独立的附件有什么不对?是的,这意味着有8个单独的方法,路由表中有8个单独的行等等......但那又怎样?我有一个非常低容量的网站,所以除了臃肿的代码,有什么理由不这样做?我用2张照片对它进行了测试,看起来效果很好。事实上,它似乎可以让事情变得更容易,因为你不需要考虑这个问题'特定照片,使其出现在文章的特定位置。

对于它的价值,每张照片都有一条如下所示的路线:

 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 任何输入将不胜感激。

1 个答案:

答案 0 :(得分:1)

老实说,最好的方法是让你了解为什么它不是最好的策略是让你去实际实现它 - 我有一种感觉你会明白为什么很快!但是,要真正回答您的问题,您解决方案的主要缺陷是:

  • 增加维护成本 - 假设您要支持图像的新文件类型。你需要在八个地方改变它,而不仅仅是一个。 (这可以通过将大的'配置哈希提取到常量或配置文件中来减轻,这是减少重复的静态数据的有效策略。)
  • 由于您的照片现在位于photo1photo2photo3等,因此无法以类似列表的方式处理类似列表的数据你快点告诉我一篇文章上有多少张照片?你怎么能按照标题对照片进行排序?
  • Icky代码 - 如果你是唯一的开发者,也许现在没关系......但最终你会回头看看它并呻吟!

正式地,你提议的内容被称为denormalization。在某些情况下,它是合理的 - 非规范化数据通常可以更快地访问,并且可以更容易地提供某些约束(例如,您希望每篇文章只允许8张照片)。

如果您正在处理类似哈希的数据集,那么它肯定是有道理的 - 例如,side_photo vs main_photo vs author_photo。但是,由于您的照片只是一个列表,我建议您在数据库中创建一个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列的操作。