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 を使用しないことをお勧めします。それには次の 3 つの理由があります。

  1. Populator はメンテナンスされなくなりました。最後のコミットは 2 年以上前です。公式リポジトリには、「Rails 3 のサポートは現在進行中です。ご期待ください」と記載されています。Rails 4 が 1 か月以上前にリリースされました。
  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 に答える