2

create次のようなアクションを使用して、csv からデータベースにユーザーをロードしようとしている次の rake タスクとユーザー コントローラーがあります。

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' の作成方法がわからないというエラーが表示されます。

4

2 に答える 2

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_usersrake -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']
于 2013-09-10T16:51:38.103 に答える
0

あなたのタスクtask :import_users => [:environment]には別のパラメーター(環境)が必要なようrake import_users_csv:import_users:developmentです。たとえば、それを実行してみてください。

編集:

実際には名前空間がありません。タスクは次のように呼び出されますrake import_users:development

于 2013-09-10T16:46:24.460 に答える