我有一个表单,用户可以上传多个图像。我需要控制器为每个上传的图像创建user_item_image
。
user_item
有很多user_item_images
。
schema.rb
create_table "user_item_images", force: :cascade do |t|
t.integer "user_item_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string "picture"
end
形式
<%= form_for :user_item_image, url: user_item_user_item_images_path(@user_item) do |f| %>
<%= f.file_field :picture, multiple: true %>
<%= f.submit %>
控制器
def create
@user_item = UserItem.find_by_id(params[:user_item_id]).user_item_images.create(user_item_image_params)
redirect_to :back
end
private
def user_item_image_params
params.require(:user_item_image).permit({picture:[]})
end
我不确定如何制作控制器的创建动作。我所拥有的不起作用。 user_item_image_params
看起来像这样
>> user_item_image_params
=> {"picture"=>[#<ActionDispatch::Http::UploadedFile:0x007f67d9b77d28 @tempfile=#<Tempfile:/tmp/RackMultipart20160317-588761-mjk73n.JPG>, @original_filename="IMG_0313.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user_item_image[picture][]\"; filename=\"IMG_0313.JPG\"\r\nContent-Type: image/jpeg\r\n">, #<ActionDispatch::Http::UploadedFile:0x007f67d9b77d00 @tempfile=#<Tempfile:/tmp/RackMultipart20160317-588761-edqw7.JPG>, @original_filename="IMG_0314.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user_item_image[picture][]\"; filename=\"IMG_0314.JPG\"\r\nContent-Type: image/jpeg\r\n">, #<ActionDispatch::Http::UploadedFile:0x007f67d9b77cd8 @tempfile=#<Tempfile:/tmp/RackMultipart20160317-588761-buatxk.JPG>, @original_filename="IMG_0315.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user_item_image[picture][]\"; filename=\"IMG_0315.JPG\"\r\nContent-Type: image/jpeg\r\n">]}
更新
我将控制器更改为:
def create
# raise 'foo'
@user_item = UserItem.find_by_id(params[:user_item_id])
user_item_image_params[:picture].each do |p|
user_item_image = @user_item.user_item_images.build(picture: p)
user_item_image.save
end
redirect_to :back
end
这似乎有效,但我不知道这看起来有点太黑了吗?有没有更好的办法?
这样做也是如何在验证失败的情况下创建如何做的逻辑?通常它就像if x.save...
。我不确定我是否应该这样做,所以如果一个文件无效或者只有有效的文件保存以及我将如何进行操作,则无法保存。
答案 0 :(得分:0)
问题在于数据类型。您在架构中使用了string
数据类型,但传递的是非字符串的对象。我建议你使用paperclip或carrierwave gem。它会处理你的附件。
你仍然不想使用任何宝石,然后你需要将这些图片存储在任何服务器上,然后将数据库中的路径保存为字符串。