使用了 rake dev
来生成测试数据,出现了两个问题。
lib/tasks/dev.rake
namespace :dev do
task :fake => :environment do
User.delete_all
Event.delete_all
users = []
users << User.create!( :email => "admin@example.org", :password => "12345678" )
10.times do |i|
users << User.create!( :email => Faker::Internet.email, :password => "12345678")
puts "Generate User #{i}"
end
20.times do |i|
topic = Event.create!( :name => Faker::Cat.name,
:description => Faker::Lorem.paragraph,
:user_id => users.sample.id )
puts "Generate Event #{i}"
end
end
task :fake_event_and_registrations => :environment do
event = Event.create!( :status => "public", :name => "FullStack Meetup", :friendly_id => "fullstack-meetup")
t1 = event.tickets.create!( :name => "Guest", :price => 0)
t2 = event.tickets.create!( :name => "VIP G1", :price => 190)
t3 = event.tickets.create!( :name => "VIP G2", :price => 199)
1000.times do |i|
event.registrations.create!( :status => ["pending", "confirmed"].sample,
:ticket => [t1, t2, t3].sample,
:name => Faker::Cat.name, :email => Faker::Internet.email,
:cellphone => "123456789", :bio => Faker::Lorem.paragraph,
:created_at => Time.now - rand(10).days - rand(24).hours )
end
puts "Let's visit http://localhost:3000/admin/events/fullstack-meetup/registrations"
end
end
运行时则使用命令 rake 任务文件名:方法名
,如:
rake dev:fake
rake dev:fake_event_and_registrations
在实际运行中遇到如下问题:
rake 任务被忽略了。
原因是 Event 在 model 中限制了 create
时一定要有 ticket
class Event < ApplicationRecord
#...
validate :check_tickets
protected
def check_tickets
if self.tickets.empty?
self.errors.add(:base, "至少需要一个 Ticket")
end
end
# ...
end
解决办法:
在运行 rake dev:fake_event_and_registrations
之前把 validate :check_tickets
注释掉。
ActiveRecord::RecordNotFound in Admin::EventRegistrationsController#index
dev.rake
中创建 Event 时指定了 friendly_id
friendly_id
却是另一回事app/models/event.rb
class Event < ApplicationRecord
#...
before_validation :generate_friendly_id, :on => :create
protected
def generate_friendly_id
self.friendly_id = SecureRandom.uuid
end
# ...
end
可见在 event.rb
中将 friendly_id
写死成 SecureRandom.uuid
self.friendly_id ||= SecureRandom.uuid