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

时间:2020-03-05 18:41:31  来源:igfitidea点击:

我目前正在为Rails应用程序使用很棒的附件插件,但是作为新手开发人员,我从未遇到过像我自己那样的情况。

本质上,我在两个级别上使用attachment-fu插件。

  • 用于用户类中的用户化身。
  • 用于允许邮件系统中的文件附件(PDF等)。

我的问题是,在这种情况下保持DRY清晰,一致的最佳用法是什么?

显然,在这两个类中定义和执行插件都是没有意义的,但是对于我而言,继续前进并将其全部设置在虔诚的Application类中,这是一件令我深感奇怪的事情(可能毫无根据)。

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

谢谢!

解决方案

回答

"外包"虚拟形象是否完全支持Gravatar?有一些Rails插件可以显示Gravatar托管的头像。我们可能不需要在那里重新发明轮子。

回答

我倾向于使用父类,通过子类化我们打算在应用程序中实际使用附件的不同方式。它可能不是可用的DRYest解决方案,但是,它很适合于逻辑模式。

回答

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

除非文件的类型相同且存储在相同的位置,否则我们将不会在配置中重复任何操作。

当然,我们将有两个has_attachment声明,但是选项将大不相同(一个用于化身的声明,另一个用于pdf等的声明。

99.99%的用于处理附件的代码将被掩埋在attachment_fu库中,默认情况下,配置代码应为DRY漂亮=

回答

我们不能使用多态关联吗?

我将在我的应用程序中使用附件_fu来实现这一目标,因此我不确定在附件_fu上是否可靠,但是对于老派的文件列插件,我将使用多态关联。

我的"文件"模型为:

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

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

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

File Column不再适用,因为它在Safari 3.x上无法使用,并且不再维护。虽然很好,却很简单...啊,过去的美好时光...

回答

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

asset.rb:

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

avatar.rb:

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

pdf.rb:

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

回答

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

http://gist.github.com/33011