2015-07-21 2 views
0

У меня есть функция импорта, которая позволяет мне импортировать данные с CSV-файлом. Это работает, но я хочу, чтобы их user_id отнести к данным, которые они импортируютИдентификатор пользователя из текущего сеанса пользователя из импортирующей функции csv

Вот код, функция импорта:

def self.import(file) 
CSV.foreach(file.path, headers: true) do |row| 

    product_hash = row.to_hash 
    Product.create!(product_hash) 

end # end CSV.foreach 

product.create от контроллера:

def create 
    @product = Product.new(product_params) 
    @product.set_user!(current_user) 
    @product.user_id = current_user.id 
    @product.save 
    respond_with(@product) 
end 

Это дает идентификатор пользователя данным, когда пользователь создает его вручную, но не тогда, когда он создает данные с помощью CSV пять через функцию импорта. Я хотел бы указать идентификатор пользователя, когда они импортируют данные в CSV, но я не знаю, как это сделать.

+0

'current_user.id' единственный идентификатор, который вы хотите назначить каждый продукт на основе вашего' метода create', правильно? так что у всех продуктов будет такой же 'user_id' правильный? –

+0

Да, если вы говорите, что человек A загружает файл со 100 продуктами, я хочу, чтобы эти 100 продуктов имели свой user_id (идентификатор от лица A). И если человек B делает то же самое, я хочу, чтобы его user_id был отнесен к продуктам (идентификатор от человека B) – dogg

ответ

1

Product.create! не использует def create, который определен в вашем контроллере. Read this для дальнейших объяснений.

Я передал бы current_user в def self.import откуда бы ни назывался. Затем присвойте user новому объекту product, который вы создаете. Поэтому предположим, вы передаете user к вашему методу def self.import, это будет что-то вроде:

product = Product.new(product_hash) product.user = user product.save

1

Хорошо, я лично не нравится ваш подход, и я могу видеть будущие недостатки в ней, однако в данном случае здесь мое предложение сохранить вещи СУХОЙ и добиться того, что вам нужно.

В вашей модели:

attr_accessor :product_user 

def save_with_a_user 
set_user!(product_user) 
user_id = product_user.id 
save! 
end 

В вашем контроллере теперь вы можете сказать

def create 
    ..... 
    @product.product_user = current_user 
    @product.save_with_a_user 
    ..... 
end 

Теперь в другую сторону сценария:

def self.import(file, current_user) 
    CSV.foreach(file.path, headers: true) do |row| 

     product_hash = row.to_hash 
     @product = Product.new(product_hash) 
     @product.product_user = current_user 
     @product.save_with_a_user 

    end # end CSV.foreach 
    end 

ВЫ ДОЛЖНЫ Refactor ЭТО

Я неоднократно определял переменную экземпляра (не очень хорошая идея, даже если вы ее переопределяете). Также я не тестировал это. Пожалуйста, используйте это как руководство.

К сожалению, вы должны пройти current_user до import. Это основная причина, по которой мне не нравится ваш подход. (Назовите меня старомодным) Мне нравится держать их в покое. (выполните некоторые исследования по шаблонам проектирования).

Приветствия

+0

Я согласен с вами @Mr H о передаче 'current_user' в код' import' – dewdrops

+1

становится вонючим, когда вы видите ' current_user' начинает появляться в моделях здесь и там. Я сам виноват в этом. Легкий способ узнать, что у вас есть вонючий код, просто попробуйте выполнить единичный тест для 'current_user' в модели.Это боль в шее. Приветствия –

+0

Здравствуйте, спасибо вам за помощь !! Я попытался с вашим методом и изменил текущий метод пользователя с вашим, и он хорошо работает, когда я добавляю новое значение вручную. Однако, когда я пытаюсь загрузить CSV, я получаю следующую ошибку: неопределенная локальная переменная или метод 'current_user 'для # и указывает на функцию импорта – dogg

Смежные вопросы