从强参数数组

时间:2016-03-17 03:27:22

标签: ruby-on-rails

我有一个表单,用户可以上传多个图像。我需要控制器为每个上传的图像创建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...。我不确定我是否应该这样做,所以如果一个文件无效或者只有有效的文件保存以及我将如何进行操作,则无法保存。

1 个答案:

答案 0 :(得分:0)

问题在于数据类型。您在架构中使用了string数据类型,但传递的是非字符串的对象。我建议你使用paperclipcarrierwave gem。它会处理你的附件。

你仍然不想使用任何宝石,然后你需要将这些图片存储在任何服务器上,然后将数据库中的路径保存为字符串。