将参数传递给CSV文件上传 - Rails

时间:2013-12-16 22:46:21

标签: ruby-on-rails csv

我的应用程序的一部分涉及更新供应商的库存。供应商将通过CSV导入执行此操作。基本上,供应商导航到特定商店的展示视图,这就是他们所看到的:

<h2>Import an Inventory</h2>

<%= form_tag import_inventory_items_path, multipart: true do %>
<%= file_field_tag :file %>
<%= hidden_field_tag :store_id, :value => @store.id %>
<%= submit_tag "Import" %>
<% end %>

这当然是我的inventory_items控制器中的导入操作:

def import
        InventoryItem.import(params[:file], params[:store_id])
        redirect_to admin_index_path, notice: "Inventory Imported."
end

这会在模型中调用import,如下所示:

def self.import(file, store_id)
CSV.foreach(file.path, headers: true) do |row|
inventory_item = InventoryItem.find_or_initialize_by_code_and_store_id(row[2], :store_id)
inventory_item.update_attributes(row.to_hash.slice(:price))
    end
end

这是我认为我遇到麻烦的地方。我要做的是将show_id从show视图中的@store传递给CSV导入方法,以便每个新记录都有一个store_id = @ store.id。我在尝试上传时收到此错误:

PG::InvalidTextRepresentation: ERROR:  invalid input syntax for integer: "store_id"

我确定我没有正确地传递@ store.id,所有人都有一些见解吗?

提前致谢!

修改

这是html输出。似乎我在模型导入方法中放弃了球?

Processing by InventoryItemsController#import as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"w/YcsZlqxnONZk+z46J7DaU6NRQeV+Czv7pIS4H3u8s=", "file"=>#<ActionDispatch::Http::UploadedFile:0x00000104fa93d0 @original_filename="Products.csv - Sheet1 (2).csv", @content_type="text/csv", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"Products.csv - Sheet1 (2).csv\"\r\nContent-Type: text/csv\r\n", @tempfile=#<File:/var/folders/6Q/6QjjMV+aFh4A4orYbGW-nE+++TI/-Tmp-/RackMultipart20131217-95734-1il2q3s>>, "store_id"=>"{:value=>1}", "commit"=>"Import"}

1 个答案:

答案 0 :(得分:1)

第一期

inventory_item = InventoryItem.find_or_initialize_by_code_and_store_id(row[2], :store_id)

应该是这个

inventory_item = InventoryItem.find_or_initialize_by_code_and_store_id(row[2], store_id)

不应该有冒号--Rails实际上没有:store_id的问题,它是有效的语法(在irb中尝试),但它搞乱了你的postgresql,因为它显然不是整数,这有点像说SELECT :store_id::integer;如果它有任何意义(它与冒号有点混淆):))

第二期

<%= hidden_field_tag :store_id, :value => @store.id %>

应该是

<%= hidden_field_tag :store_id, @store.id %>

添加:value =>会将其变为哈希值,如params所示 -

 "store_id"=>"{:value=>1}"

添加:value属性是直观的,但它实际上是错误的。