【问题标题】:Ruby-on-Rails Create Record from Rake TaskRuby-on-Rails 从 Rake 任务创建记录
【发布时间】:2013-09-14 11:53:58
【问题描述】:

我有以下 rake 任务和用户控制器即时尝试使用 create 操作将用户从 csv 加载到数据库中,如下所示:

lib/tasks/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”

【问题讨论】:

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


    【解决方案1】:

    您的任务task :import_users => [:environment] 似乎需要另一个参数(环境),例如尝试以rake import_users_csv:import_users:development 运行它。

    编辑:

    你实际上没有命名空间,你的任务是用rake import_users:development调用的

    【讨论】:

    • 恐怕没有什么不同。
    • 对不起,我错过了命名空间的事情,你实际上没有命名空间,只是一个描述,所以你不能在 rake 任务调用中使用import_users_csv
    【解决方案2】:

    您在正确的命名空间中有任务吗?您运行任务的方式,它需要在 :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']
    

    【讨论】:

    • 谢谢!这解决了错误,不幸的是,该任务似乎没有做任何事情。
    • @user2732663 啊,你使用的是:headers => true。这使得row 成为哈希,因此您需要使用标题值来访问单元格的内容。
    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多