在 Ruby on Rails 应用程序中尽可能 DRY

Posted

技术标签:

【中文标题】在 Ruby on Rails 应用程序中尽可能 DRY【英文标题】:Being as DRY as possible in a Ruby on Rails App 【发布时间】:2010-09-06 09:45:47 【问题描述】:

我目前正在为 Rails 应用程序使用超棒的 attachment-fu 插件,但作为一名新手开发人员,我从未遇到过像我遇到的那样的场景。

基本上,我在两个层面上使用了 attachment-fu 插件。

    用于用户类中的用户头像。 允许在消息系统中添加文件附件(PDF 等)。

我的问题是在这些情况下保持、清晰和一致的最佳使用实践是什么。

很明显,在这两个类中定义和执行插件是没有意义的,但我觉得很奇怪(可能没有根据),只是继续在虔诚的 Application 类中设置它。

两者之间有什么关系,还是父类是要走的路?

谢谢!

【问题讨论】:

【参考方案1】:

“外包”头像支持完全支持Gravatar 是一种选择吗?有一些 Rails 插件可以显示 Gravatar 托管的头像。您可能不需要在那里重新发明***。

【讨论】:

【参考方案2】:

我倾向于使用父类,并根据您打算在应用程序中实际使用附件的不同方式进行子类化。它可能不是可用的 DRYest 解决方案,但它非常适合逻辑模式。

【讨论】:

【参考方案3】:

两次定义 attachment_fu 设置的 DRY 问题是什么?

除非文件属于同一类型并存储在同一位置,否则您不会在配置中重复任何内容。

当然,您将有两个 has_attachment 声明,但选项大多不同(一个声明用于您的头像,另一个用于您的 pdf 等。

99.99% 的附件处理代码将隐藏在 attachment_fu 库中,默认情况下您的配置代码应该相当 DRY =)

【讨论】:

【参考方案4】:

你不能用Polymorphic Associations吗?

我即将在我的应用程序中使用 attachment_fu,所以我不太确定 attachment_fu,但对于老式的 File Column 插件,我会使用多态关联。

我的“文件”模型是:

    class FileUpload < ActiveRecord::Base
      belongs_to :fileable, :polymorphic => true
      file_column :name
    end

然后任何需要文件附件的模型都是这样的:

    class Company < ActiveRecord::Base
      has_many :file_uploads, :as => :fileable
    end

文件列不再好用了,因为它在 Safari 3.x 上出现问题并且不再维护。不过它很好很简单……啊,过去的美好时光……

【讨论】:

【参考方案5】:

wfarr 描述的是single table inheritance,这是我目前在这种情况下所做的。我有一个 Assets 表,其中包含所有必要的 attachment_fu 列,以及一个名为 type 的额外列,它将保存实际的模型名称。我有一个资产模型和从资产继承的特定上传类型的其他模型:

资产.rb:

class Asset < ActiveRecord::Base
  ... attachment_fu logic ...
end

头像.rb:

class Avatar < Asset
  ... avatar specific attachment_fu logic ...
end

pdf.rb:

class PDF < Asset
  ... PDF specific attachment_fu logic ...
end

【讨论】:

【参考方案6】:

就其价值而言,我认为 Patrick Berkeley 在通过 Paperclip 插件处理多个附件方面做得很好。他在这里概述了他的工作:

http://gist.github.com/33011

【讨论】:

以上是关于在 Ruby on Rails 应用程序中尽可能 DRY的主要内容,如果未能解决你的问题,请参考以下文章

新手入门 Ruby On Rails 必备的知识体系

Ruby-on-Rails:多个 has_many :通过可能吗?

Ruby on Rails - Ruby 中的 KeyCode [关闭]

在 ruby​​ on rails 中,感叹号后面是啥意思? [复制]

思考Ruby On Rails的底层代码(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)

如何在 Ruby on Rails 中使用 Devise 验证密码强度?