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