2013-07-04 78 views
1

我建立一個測試應用程序,並與法克爾寶石跨越問題就來了:的Rails 3.2.13 +法克爾+設計+ Rolify

我創建使用模型設計和使用Rolify寶石創建角色,然後稍後將使用CanCan來限制用戶的使用權限。

所以,用法克爾我創建了一個文件,我的耙子任務:

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

我不鼓勵使用populator gem。有三個原因:

  1. populator不再維護,最後一次提交是在兩年前。 official repository仍然表示「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 

請注意我:

  • 刪除需要報表(至少在我的系統是不是必要的)
  • 移動密碼成塊
  • 正在使用的功能添加角色,不分配(=)之前保存用戶 - 使用無法填充器

使用這種結構,可以使用戶實例更方便的事情,例如。防止在使用Devise時發送確認電子郵件:通過在保存之前調用user.skip_confirmation!進行確認 - 您可能會發現有用。

考慮以及由Faker生成的first_name和last_name生成電子郵件之前,用戶的名稱和電子郵件內聯。爲了實現這一目標,你可以通過

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

趁着塊分子,因此建立一個獨特的電子郵件取代

Faker::Internet.email 

相關問題