我尝试使用carrierwave上传多个文件,然后将它们上传到cloudinary,但问题是将图片网址存储到psql数组列中。 我收到这个错误:
ActiveRecord::StatementInvalid (PG::InvalidTextRepresentation: ERROR: malformed array literal: "image/upload/v1460539908/u5fzgamsmt2rmnusees5.jpg"
LINE 1: UPDATE "products" SET "images" = 'image/upload/v1460539908/u...
^
DETAIL: Array value must start with "{" or dimension information.
:UPDATE "products" SET "images" = 'image/upload/v1460539908/u5fzgamsmt2rmnusees5.jpg' WHERE "products"."id" = $1):
app/controllers/products_controller.rb:26:in `create'
收到的params似乎是正确的,发送多个文件等。 SQL:
INSERT INTO "products" ("title", "images", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["title", ""], ["images", "{u5fzgamsmt2rmnusees5.jpg,oznphywjmfykswlzzgit.jpg,x4kzdzgggzpnf7ho0w5e.jpeg,v4dlu4sdtbbtiaspvmu2.jpeg}"], ["created_at", "2016-04-13 09:31:48.306261"], ["updated_at", "2016-04-13 09:31:48.306261"]]
它确实以" {}"开头,或者它想要没有literar""?
迁移:
class AddImagesToProducts < ActiveRecord::Migration
def change
add_column :products, :images, :string, array: true, default: []
end
end
架构:
create_table "products", force: :cascade do |t|
t.string "title"
t.text "description"
t.decimal "price"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "department_id"
t.integer "category_id"
t.string "images", default: [], array: true
end
控制器:
def create
@product = Product.new(product_params)
@product.save
end
private
def product_params
params.require(:product).permit(:title, {images: []})
end
class Product < ActiveRecord::Base
mount_uploaders :images, ImageUploader
end
EDIT 将params.require(:product).permit(:title,images:[])更改为params.require(:product).permit(:title,{images:[]})但仍然没有
EDIT2 形式:
<%= stylesheet_link_tag "navbar" %>
<%= form_for @product, :html => {:multipart => true} do |f| %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.file_field :images, multiple: true %>
</p>
<p><%= f.submit %></p>
<% end %>
答案 0 :(得分:0)
所以看起来问题出在我使用的cloudinary gem中,他们不支持psql json或数组列。所以我让它工作的方式是产品控制器,我补充道:
params[:product][:images].each do |image|
Cloudinary::Uploader.upload(image)
end