2013-09-10 2 views
2

У меня есть следующие задачи грабли и контроллер пользователь им пытается загрузить пользователей в базу данных из CSV, используя create действие следующим образом:рубин-на-рельсы Создать запись из Rake Task

Библиотека/задач/import_users_csv. рейк:

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) я получаю ошибку дону t знать, как построить задачу 'import_users_csv: import_users'

ответ

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, чтобы просмотреть список задач рейка, которые вы можете запустить. Вы должны увидеть, что вы указали там.

Edit:

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'] 
+0

Спасибо! это устраняет ошибку, к сожалению, задача, похоже, ничего не делает. – user2732663

+0

@ user2732663 А, вы используете ': headers => true'. Это делает «row» хешем, поэтому вам нужно использовать значения заголовка для доступа к содержимому ячеек. –

0

Похоже, что для вашей задачи task :import_users => [:environment] требуется другой параметр (среда), попробуйте запустить его, например, как rake import_users_csv:import_users:development.

EDIT:

Вы на самом деле не имеют имен, ваша задача вызывается с rake import_users:development

+0

не делает разницы, я боюсь. – user2732663

+0

Извините, что я пропустил предмет пространства имен, на самом деле у вас нет пространства имен, просто описание, поэтому вы не можете использовать 'import_users_csv' в вызове задачи рейка. – Miguelgraz