Rails回形针使用自定义ID进行插值和before_save

时间:2018-06-22 19:53:04

标签: ruby-on-rails paperclip

在我的应用程序(Rails 5.2)中,我的模型使用UUID类型的id。 我又创建了一个字段:id_server,它将是我想与回形针一起使用的id,以用于:id_partition创建多个文件夹(默认的id_partition与id字段一起工作,而不与另一个字段一起工作)。

我已经做到了:

before_save do
  id_server = Photo.maximum(:id_server) + 1
end

创建下一个id_server。

对于回形针:

# paperclip
has_attached_file :file, path: "/upload/:class/:attachment/:id_server_partition/:style/:basename.:extension",
styles: { :tiny => "140x140>", :small => "160x240", :high => "640x960" }                   

validates_attachment :file, content_type: { content_type: ['image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png'] }
validates_attachment :file, size: { in: 0..5.megabytes }

# create multiple folders path with id_server
Paperclip.interpolates :id_server_partition do |attachment, style|
  attachment.instance.id_server_partition
end
def id_server_partition
  ("%09d".freeze % id_server).scan(/\d{3}/).join("/".freeze)
end

事实是,在Paperclip.interpolates之前似乎从未调用过before_save()。

id_server为零:

("%09d".freeze % id_server).scan(/\d{3}/).join("/".freeze)
  

无法将nil转换为Integer

我想念什么?

1 个答案:

答案 0 :(得分:0)

奇怪的是,这是因为自我不在:

before_save do
end

这可行,并且id_server在这里创建:

self.id_server = Photo.maximum(:id_server) + 1

但不是这样:

id_server = Photo.maximum(:id_server) + 1

但是在这里,不需要id_server之前的自我:

("%09d".freeze % id_server).scan(/\d{3}/).join("/".freeze)