Rails 3.2.13 + Faker + Devise + Rolify

时间:2013-07-04 00:34:41

标签: ruby-on-rails devise rolify faker

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

我已经使用Devise创建了Use model并使用了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,但没有运气。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我不鼓励你使用populator gem。这有三个原因:

  1. 不再维护Populator,最后一次提交是在两年多前。 official repository仍然说“Rails 3支持目前正在进行中。请继续关注。” Rails 4在一个月前发布。
  2. 它没有数据验证。您可以确保添加正确的数据值。这可能最终会变得非常混乱。
  3. 以编程方式进行编程非常容易,让您可以更好地控制自定义案例,从而使您成为更好的开发人员=)
  4. 您可以使用以下代码添加用户角色来构建数据库填充程序:

    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
    

    请注意我:

    • 已删除需要语句(至少在我的系统上不是必需的)
    • 将密码移到块中
    • 使用函数添加角色,而不是赋值(=)保存用户之前 - 使用populator不可能

    使用此构造,您可以使用User实例制作更方便的东西,例如。阻止在使用Devise时发送确认电子邮件:在保存前通过调用user.skip_confirmation!确认 - 您可能会觉得有用。

    考虑生成基于faker之前已生成的first_name和last_name的电子邮件,然后将用户名和电子邮件内联。为此,您可以替换

    Faker::Internet.email
    

    通过

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

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