Ruby on rails 将关联添加到从表单导入的CSV
我想在导入时将Ruby on rails 将关联添加到从表单导入的CSV,ruby-on-rails,ruby,csv,Ruby On Rails,Ruby,Csv,我想在导入时将当前_user.id添加到CSV导入的每个字段中 我已成功导入CSV文件,但尝试以下操作时: 型号: def self.import(file) CSV.foreach(file.path, headers: true) do |row| product_hash = row.to_hash product = Product.find_or_create_by!(sku: product_hash['sku']) product.update_attr
当前_user.id
添加到CSV导入的每个字段中
我已成功导入CSV文件,但尝试以下操作时:
型号:
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
product_hash = row.to_hash
product = Product.find_or_create_by!(sku: product_hash['sku'])
product.update_attributes!(product_hash)
end
end
控制器:
def create
user = current_user
Product.import(params[:product][:file], user_id: user.id)
respond_to do |format|
format.html { redirect_to '/', notice: 'Products successfully imported.' }
end
end
表格:
(还尝试为用户添加隐藏字段)
错误:
ArgumentError(参数数目错误(给定2个,应为1个)):
因为我不能调用模型中的当前用户(或者,根据我的阅读,这是一个坏主意)。否则,我如何才能将当前的_user.id附加到每个CSV导入行上?如果您的操作如此简洁,那么模型是一个很好的地方(对于更长的预处理时间,您可能会选择使用服务,但对于仅几行,模型很好) 虽然您无法访问模型中的当前用户(它是视图和控制器可用的辅助操作,因为它依赖于会话),但您几乎可以将其传递给模型,这是完全可以接受的 假设您直接上载文件(在某些托管解决方案中不允许您接受文件上载),那么如果您将其更改为同时允许文件名和用户对象,则您的方法将起作用 我将模型方法更改为:
def self.import(file:, user_id:)
CSV.foreach(file.path, headers: true) do |row|
product_hash = row.to_hash.merge(user: user_id)
product = Product.find_or_create_by!(sku: product_hash['sku'])
product.update_attributes!(product_hash)
end
end
并将实施更改为
Product.import(file: params[:product][:file], user_id: user.id)
仅供参考,
def method_name(param:,param_2:)
表示这两个参数都是必需的。如果只需要一个参数,您可以执行def method_name(param:,param_2:nil)
,这使得第二个参数是可选的任何遇到此参数的人product\u hash=row.to\u hash.merge(user\u id:user\u id
是我必须做的一个更改
Product.import(file: params[:product][:file], user_id: user.id)