Ruby on rails 如何在生产中将示例数据填充到我的Rails应用程序中?
我有一个n00b问题。我使用的是Rails 5,希望在应用程序中有示例数据。当用户创建新项目时,该项目应该已经包含用户可以删除或编辑的示例任务 我知道我可以使用seeds.rb在我的开发环境中创建示例数据。对于新用户来说,在生产环境中实现这一点的最佳方式是什么?如何实现?我应该使用seeds.rb、迁移还是rake任务 控制器示例:Ruby on rails 如何在生产中将示例数据填充到我的Rails应用程序中?,ruby-on-rails,Ruby On Rails,我有一个n00b问题。我使用的是Rails 5,希望在应用程序中有示例数据。当用户创建新项目时,该项目应该已经包含用户可以删除或编辑的示例任务 我知道我可以使用seeds.rb在我的开发环境中创建示例数据。对于新用户来说,在生产环境中实现这一点的最佳方式是什么?如何实现?我应该使用seeds.rb、迁移还是rake任务 控制器示例: def create @project = Project.new(project_params) @project.user = curren
def create
@project = Project.new(project_params)
@project.user = current_user
if @project.save
// add sample content
redirect_to @project
else
render :new
end
end
在项目模型中:
belongs_to :user
has_many :tasks, dependent: :destroy
当新用户加入并创建新项目时,如何在用户创建的新项目上自动添加示例任务
更新:
要创建任务,我需要一个说明和我正在使用的Desive的当前用户id,这样我就可以使用当前用户助手,例如:
@project.tasks.create!(description: "hello", user_id: current_user.id)
假设示例数据位于使用seeds.rb填充的模型细节上,属于“项目”。您可以复制该记录并将其分配给未测试的新项目: def创建 @project=project.newproject\u参数 @project.user=当前用户
@project.details考虑到您的问题,有两种可能的情况 默认情况下,用户创建的第一个项目需要包含示例任务 无论何时创建新项目,默认情况下都会创建样例任务。不管用户是新用户还是现有用户。 对于第一个场景, 我们需要通过向用户添加一个布尔字段来跟踪项目是否由新用户创建,例如:new_user,默认为true。 在创建项目后,我们可以使用活动记录回调来生成示例任务 比如说,, 项目模型:
belongs_to :user
has_many :tasks, dependent: destroy
after_create :generate_tasks
def generate_tasks
if self.user.new_user #This conditional block can be modified as needed
(1..3).each do |n|
self.tasks.create!(description: "Sample task #{n}", user_id: self.user.id)
end
end
end
对于第二种情况,
我们可以使用相同的项目模型文件,只需删除有助于在项目创建后创建示例任务的条件语句
如果您需要任何澄清,请留言 完全公开,我在Rails 4工作 如果是我,我会用它来获取你想要的虚拟数据。工厂非常适合测试,所以如果你使用它们进行测试,为什么不借用它们呢?这显示了一个示例,其中有人想要在控制台中模拟虚拟数据,这里同样的想法也适用于您 一旦你把工厂改造好了。。。可能用于以下任务:
require 'faker'
FactoryBot.define do
factory :task do
transient do
parent_project { nil }
end
description { Faker::Hacker.say_something_smart }
project_id { parent_project.id }
end
end
可以在项目模型中创建一个方法,如:
def create_dummy_data
require 'factory_bot'
require 'faker'
include FactoryBot::Syntax::Methods
# create_list will spit out 3 tasks associated with your project
create_list(:task, 3, parent_project: self)
end
然后在您的示例中:调用save之后
if @project.save
@project.create_dummy_data
redirect_to @company
else
我想不出你为什么不能走这条路。。。在控制台中闲逛并没有任何问题,但我会把这个答案看作是一个起点,而不是最终的解决方案=P
您可以构建一个简单的ServiceObject来完成这项工作。它允许您保持控制器的精简,并且您可以使用当前用户Desive helper来跟踪哪个用户正在创建项目
if @project.save
SetupBaseProject.new(project).call
redirect_to @project
else
# handle errors
end
在app/services/setup\u base\u project.rb中
我在过去做过很多次。 根据我的经验,你最终必须让其他人能够管理那些默认的产品所有者、营销等 我过去所做的是让一个测试用户拥有一个充当“默认”项目的项目 无论何时,只要有人想要创建一个新项目,您都可以克隆它
我用过这个。它提供了一种方法来覆盖我想要更改的属性,并可以将克隆级联到您想要克隆的任何关联。一种解决方案可以是创建一个服务,您可以将示例项目的数据放入其中,然后在创建用户时,在param中使用创建的用户执行此服务。用户将能够删除或编辑此示例项目。另外,当一个已经注册的用户创建一个项目时,如果您想要hanks@dharmesh,您将能够获取示例数据并将if传递给他的新项目!我有一个问题,在我的任务中,我还必须添加一个用户id,但我不能在模型中使用Desive current\u user helper。也许后创建逻辑应该在控制器中?我将更新问题。@userden我现在已经清楚地理解了您的问题,这可以通过使用活动记录回调本身来完成。我已经更新了我的答案,以实现这一目标。请验证更新的答案。如果有任何其他澄清,请告诉我@userden,你试过这个吗?如果你需要对我的答案进行澄清,请告诉我。是的,它很有效,我很喜欢。我只是在等待,想什么是最好的或正确的方法来做这件事?我也喜欢Vincent在回答中提出的使用简单ServiceObject的想法。无论如何,我会很快批准你的答案,我只是测试了一件事。谢谢@dharmesh,很抱歉我花了一段时间才回来!
class SetupBaseProject
def initialize(project, user)
@project = project
end
def call
# Create example tasks and any additional setup you want to add
@project.tasks.create(description: 'Hello World', user: @project.user)
end
end