【问题标题】:Generating Paperclip image uploads with fake data - Ruby on Rails Populator / Faker Gems使用假数据生成回形针图像上传 - Ruby on Rails Populator / Faker Gems
【发布时间】:2011-04-26 15:13:09
【问题描述】:

我目前正在尝试用一堆假数据填充项目的开发数据库,​​以模拟数百篇文章/用户的外观和操作方式。我研究了不同的 gem 来完成这项任务 - 例如 Factory Girl,但文档非常缺乏,我没有得到它 - 但最终使用 Populator 和 Faker gem 并完成了以下 rake 任务......

namespace :db do
   desc "Testing populator"
   task :populate => :environment do
      require "populator"
      require "faker"

      User.populate 3 do |user|
         name = Faker::Internet.user_name   
         user.name = name
         user.cached_slug = name
         user.email = Faker::Internet.email
         user.created_at = 4.years.ago..Time.now
      end
   end
end

效果很好...适用于基于文本的数据。但是,所有用户都有一个可以通过回形针附件上传的头像,所有常规内容都以相同的方式具有缩略图附件。

我了解 Populator gem 只是直接填充到数据库中,而不必通过 ActiveRecord 验证来执行此操作..因此我假设 Paperclip 无法运行以生成所有不同的缩略图和需要(并上传到如果我刚刚在上面的 rake 任务中用文件路径填充了该字段,则用于头像的正确目录)。

有没有办法通过 Populator 或其他方式填充假图像?或者也许是一种将 rake 任务指向我硬盘驱动器上的库存图像目录的方法,以便为每条记录自动生成随机缩略图?在 Google 上搜索了一个方法,但没有找到关于该主题的太多信息。

更新

最终的解决方案,基于pwnfactory的思路……

namespace :db do
  desc "Testing populator"
  task :populate => :environment do
    require "populator"
    require "faker"

    User.populate 3 do |user|
      name = Faker::Internet.user_name
      user.name = name
      user.cached_slug = name
      user.email = Faker::Internet.email
      user.created_at = 4.years.ago..Time.now
    end

    User.all.each { |user| user.avatar = File.open(Dir.glob(File.join(Rails.root, 'sampleimages', '*')).sample); user.save! }
  end
end

它基本上是从所有记录的sampleimages目录中循环并上传头像。

【问题讨论】:

    标签: ruby-on-rails paperclip


    【解决方案1】:

    要在您的任务中关联随机图像,您可以尝试以下操作:

    user.avatar = File.open(Dir.glob(File.join(Rails.root, 'sampleimages', '*')).sample)
    

    其中 sampleimages 是包含要随机关联的头像的目录

    【讨论】:

    • 试一试,并在我上面的 rake 任务中插入该行(并在我的 rails 项目中创建了 sampleimages 目录),但它吐出了“rake aborted!undefined method `avatar=' for #" 运行任务。由于数据库将列分为三列(avatar_file_name、avatar_content_type、avatar_file_size),这可能就是原因。
    • 您必须使用您在模型中定义的名称,例如:class Photo < ActiveRecord::Base has_attached_file :foto end 在这里,您需要使用 photo.foto = ...
    • 这就是我正在做的事情,我的用户模型的附件被命名为“头像”(has_attached_file :avatar)。
    • 抱歉,没有意识到 Populate 不使用模型的实际实例。一个想法是使用 AR 实例设置头像的第二个循环。例如:User.all.each{ |user| user.avatar = File.open(Dir.glob(File.join(Rails.root, 'sampleimages', '*')).sample);user.save} 虽然这可能在某种程度上违背了 Populate 的目的
    • 对,有点被操纵,但它有效。我不得不对您的代码稍作调整(粘贴上面的修订版),但基本上在通过 Populate 生成用户之后,它会循环返回并将头像上传到每个用户。唯一令人沮丧的是,我认为它会覆盖那些已经上传了头像的人,但是从这里开始应该非常简单,以便在仅针对 NULL 用户的条件下工作。非常感谢。
    【解决方案2】:
    user.avatar = File.open(Dir['app/assets/images/*.jpg'].sample)
    

    【讨论】:

      【解决方案3】:

      我解决这个问题的一种方法是在我的视图中添加一个条件。

      假设您的模型是“用户”,并且它有一个头像。然后您可以执行以下操作:

      <% if product.avatar.exists? %>
        ... show the attached photo
      <% else %>
        .. show a default photo
      <% end %>
      

      这适用于 Paperclip,我一直在我的开发数据库中使用它,而不是担心将所有图像附加到所有用户。

      【讨论】:

      • 离题,但还有另一种方法可以做到这一点...如果您在模型的 has_attached_file 中使用 default_url,则视图中的回形针调用将回退到默认图像,如果没有找到上传的图片。方便并减少查看代码。至于我的情况,我已经让我的用户设置了这种方式,但我希望看到一些随机性......更不用说内容必须附有图像,没有后备版本。
      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 2013-12-14
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多