我有以下rake任务和用户控制器尝试使用create
操作从csv将用户加载到数据库中,如下所示:
LIB /任务/ import_users_csv.rake:
desc "Import Users from csv file"
task :import_users => [:environment] do
file = "db/users.csv"
CSV.foreach(file, :headers => true) do |row|
User.create(
:name => row[1],
:email => row[2],
:password => row[3],
:password_confirmation => row[4],
:admin => row[5],
:role => row[6]
)
end
end
users_controller.rb:
def create
@user = User.new(user_params)
if @user.save
flash[:success] = "User " + @user.name.to_s + " sucessfully created"
redirect_to @user
else
render 'new'
end
end
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation, :role, :admin)
end
不幸的是,当我尝试运行任务(rake import_users_csv:import_users
)时,我得到的错误不知道如何构建任务'import_users_csv:import_users'
答案 0 :(得分:4)
你在正确的命名空间中有任务吗?您运行任务的方式,它需要位于:import_users_csv
命名空间内:
namespace :import_users_csv do
desc "Import Users from csv file"
task :import_users => [:environment] do
file = "db/users.csv"
CSV.foreach(file, :headers => true) do |row|
User.create({
:name => row[1],
:email => row[2],
:password => row[3],
:password_confirmation => row[4],
:admin => row[5],
:role => row[6]
})
end
end
end
如果您不想要名称空间,您应该能够rake import_users
。使用rake -T
查看可以运行的rake任务列表。你应该看到你的名单。
修改强>
CSV.foreach(file, :headers => true) do |row|
调用实际上会返回Hash
,其中键是标题行中的值。如果您有以下CSV文件:
Foo,Bar,Baz
1,2,3
4,5,6
您想要像这样访问它:
:foo => row['Foo'],
:bar => row['Bar'],
:baz => row['Baz']
答案 1 :(得分:0)
您的任务task :import_users => [:environment]
似乎需要另一个参数(环境),例如尝试将其作为rake import_users_csv:import_users:development
运行。
编辑:
您实际上没有命名空间,使用rake import_users:development