1

我正在构建一个测试应用程序并遇到了 Faker gem 的问题:

我已经使用 Devise 创建了 Use 模型并使用 Rolify gem 创建角色,然后将使用 CanCan 来限制用户的使用权限。

因此,我使用 Faker 为我的 rake 任务创建了一个文件:

namespace :db do

  desc "Fill dummy DB"

  task :populate => :environment do

    require "populator"

    require "faker"

    password = "password"

    User.populate 198 do |user|
      user.firstname = Faker::Name.first_name
      user.lastname = Faker::Name.last_name
      user.email = Faker::Internet.email
      user.encrypted_password = User.new(:password => password).encrypted_password
      user.phone   = Faker::PhoneNumber.phone_number
      user.address1  = Faker::Address.street_address
      user.city    = Faker::Address.city
      user.state   = Faker::Address.state_abbr
      user.zip     = Faker::Address.zip_code
      user.latitude = Faker::Address.latitude
      user.longitude = Faker::Address.longitude
    end

  end
end

这段代码有效,它创建了 198 个虚拟用户......但是当我查看我的 users_roles 表时 - 那里什么都没有,用户没有分配给他们的角色。我一直在试图弄清楚如何通过 Faker 为用户分配角色,但没有运气。

我试过添加user.role_id = User.add_role :user,但没有运气。

先感谢您。

4

1 回答 1

1

我不鼓励您使用 populator gem。原因有以下三个:

  1. Populator 不再维护,上次提交是在两年多前。官方存储库仍然说“Rails 3 支持目前正在进行中。敬请期待。” 一个多月前发布的 Rails 4。
  2. 它没有数据验证。您可以确保添加正确的数据值。这最终可能会变得非常混乱。
  3. 以编程方式让您更好地控制自定义案例并因此使您成为更好的开发人员真的很容易 =)

您可以使用以下代码添加用户角色来构建数据库填充器:

namespace :db do

  desc "Fill dummy DB"

  task :populate => :environment do

    198.times do |n|
      user = User.new(
        firstname: Faker::Name.first_name,
        lastname:  Faker::Name.last_name,
        email:     Faker::Internet.email,
        password:  "password",
        phone:     Faker::PhoneNumber.phone_number,
        address1:  Faker::Address.street_address,
        city:      Faker::Address.city,
        state:     Faker::Address.state_abbr,
        zip:       Faker::Address.zip_code,
        latitude:  Faker::Address.latitude,
        longitude: Faker::Address.longitude )
      user.add_role :user
      user.save
    end
  end
end

请注意,因为我:

  • 删除了require语句(至少在我的系统上是不需要的)
  • 将密码移动到一个块中
  • 在保存用户之前使用函数添加角色,而不是赋值 (=) - 无法使用填充器

使用此构造,您可以使用 User 实例做更方便的事情,例如。防止在使用 Devise 的 :confirmable 时发送确认电子邮件,方法是user.skip_confirmation!在保存前调用 - 您可能会发现这很有用。

还可以考虑根据 Faker 之前已经生成的 first_name 和 last_name 生成电子邮件,以使用户名和电子邮件内联。为此,您可以更换

Faker::Internet.email

经过

"#{user.first_name}.#{user.last_name}#{n+1}@example.com"

利用块分子,从而创建一个独特的电子邮件。

于 2013-08-09T17:13:11.810 回答