Ruby-on-Rails从Rake Task创建记录

时间:2013-09-10 16:43:09

标签: ruby-on-rails ruby csv rake ruby-on-rails-4

我有以下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'

2 个答案:

答案 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

调用您的任务