gpt4 book ai didi

activeresource - 带有 ActiveResource 的 CarrierWave

转载 作者:行者123 更新时间:2023-12-04 23:08:47 28 4
gpt4 key购买 nike

是否有人对将 CarrierWave 与 ActiveResource 模型(在 Rails 3 中)一起使用有任何见解?我有一个带有文件名字段的 ActiveResource 模型,我想将文件保存到远程文件系统。

我尝试了一些事情但没有取得多大成功(或者确信我在远程正确地做任何事情),所以我很感激任何成功实现 CarrierWave 而不使用 gem 中已经包含的 ORM 模块的人的建议。

最佳答案

由于原作者继续前进,我可能迟到了,但是当有人搜索“carrierwave activeresource”时,这个问题出现在顶部,所以我认为它仍然值得回答。

为了便于讨论,我们假设我们有一个名为 Artist 的模型,其中一个名为 Artist_picture 的图片作为 CarrierWave 上传器安装。使用 ActiveRecord,您可以将此图片分配给文件:

artist.artist_picture=File.open('ravello.jpg')

当您保存艺术家时:
artist.save!

图片也将被保存。

现在,假设我基于此创建了一个资源:
class Artist < ActiveResource::Base
end

如果我随后读到一位艺术家:
artist = Artist.find(1)

看看它,我会在那里找到这个:
#<Artist:0x39432039 @attributes={"id"=>1, "name"=>"Ravello", "artist_picture"=>#<ArtistPicture:0x282347249243 @attributes={"url"=>"/uploads/artists/artist_picture/1/ravello.jpg"}, @prefix_options={}, @persisted=false>, @prefix_options={}, @persisted=false>

有趣的是,artist_picture 本身就是一个模型,如果我们愿意,我们可以声明它并使用它。实际上,您可以根据需要使用 url 来抓取图片。但是,让我们谈谈上传另一张图片。

我们可以将这一点代码添加到服务器端的 Artist 模型中:
  def artist_picture_as_base64=(picsource)
tmpfile = Tempfile.new(['artist','.jpg'], Rails.root.join('tmp'), :encoding => 'BINARY')
begin
tmpfile.write(Base64.decode64(picsource.force_encoding("BINARY")))
file = CarrierWave::SanitizedFile.new(tmpfile)
file.content_type = 'image/jpg'
self.artist_picture = file
ensure
tmpfile.close!
end
end

我只是展示一个简单的例子——你也应该传递原始文件名。无论如何,在资源方面:
class Artist < ActiveResource::Base
def artist_picture=(filename)
self.artist_picture_as_base64=Base64.encode64(File.read(filename))
end
end

此时,在资源端,您只需将“artist_picture”设置为文件名,保存资源时将其编码并发送。在服务器端,文件将被解码并保存。据推测,您可以通过将字符串强制为二进制编码来跳过 base64 编码,但是当我这样做时它会出错,而且我没有耐心去追踪它。编码为 base64 有效。

关于activeresource - 带有 ActiveResource 的 CarrierWave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5240973/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com