Ruby on rails Rails-多张带回形针的照片…什么';这个主意怎么了?

Ruby on rails Rails-多张带回形针的照片…什么';这个主意怎么了?,ruby-on-rails,paperclip,Ruby On Rails,Paperclip,我目前正在使用回形针和imagemagick为我的文章上传一张照片。我一直在寻找添加多张照片的方法。我不需要无限的照片,事实上我想限制到每篇文章8。这让我思考,仅仅拥有8个独立附件有什么不对?是的,这意味着在路由表中有8个独立的方法,8个独立的行,等等……但那又怎样呢?我有一个非常小的网站,所以除了臃肿的代码,有什么理由不这样做吗?我已经用两张照片测试过了,看起来效果不错。事实上,它似乎使事情变得更容易,因为你不需要考虑一个特定的照片的ID,使它出现在文章中的某个地方。 值得一提的是,每张照片都

我目前正在使用回形针和imagemagick为我的文章上传一张照片。我一直在寻找添加多张照片的方法。我不需要无限的照片,事实上我想限制到每篇文章8。这让我思考,仅仅拥有8个独立附件有什么不对?是的,这意味着在路由表中有8个独立的方法,8个独立的行,等等……但那又怎样呢?我有一个非常小的网站,所以除了臃肿的代码,有什么理由不这样做吗?我已经用两张照片测试过了,看起来效果不错。事实上,它似乎使事情变得更容易,因为你不需要考虑一个特定的照片的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
我的模型中的一条语句如下所示:

 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
如有任何意见,将不胜感激

老实说,你要知道为什么这不是最好的策略,最好的办法就是去实际实施它——我觉得你会很快知道为什么!然而,要真正回答您的问题,您的解决方案的主要缺陷是:

  • 增加了维护成本——假设您希望为图像支持新的文件类型。你需要在八个地方换,而不是一个地方。(这可以通过将大型ol'config散列提取到常量或配置文件中来缓解,这是减少重复静态数据的有效策略)
  • 无法以类似列表的方式处理类似列表的数据——既然您的照片现在生活在
    photo1
    photo2
    photo3
    ,等等中,您如何快速告诉我一篇文章上有多少张照片?你怎么能把照片按标题分类呢
  • 讨厌的代码——如果你是唯一的开发人员,也许现在这不重要了。。。但最终,即使你回首往事,也会呻吟
从形式上讲,你的建议被称为。在某些情况下,这是合理的——非规范化数据通常访问速度更快,并且可以更容易地提供某些约束(例如,您希望每篇文章只允许八张照片)

如果您处理的是更像散列的数据集,那么它肯定是有意义的——例如,
side\u photo
vs
main\u photo
vs
author\u 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\u id
参数中使用了该方法。因此,您只需要一条路径,匹配
删除文章/:id/photos/:photo\u id
,以及处理所有photoX专栏的操作。

Robert,感谢您如此深入的回答!很好的指导。