我如何将此哈希请求拆分为两个不同的字符串?
我想将其拆分为#<ActionDispatch
,这标志着请求中选择的下一个图像的开始。我如何在ruby中实现这一目标?
请求
{"image"=>{"picture"=>[#<ActionDispatch::Http::UploadedFile:0x10c986d88 @tempfile=#<File:/var/folders/bx/6z1z5yks56j40v15n43tjh1c0000gn/T/RackMultipart20130404-53101-3c2whv-0>,
@headers="Content-Disposition: form-data; name=\"image[picture][]\"; filename=\"background-pic.jpg\"\r\nContent-Type: image/jpeg\r\n",
@content_type="image/jpeg",
@original_filename="background-pic.jpg">,
#<ActionDispatch::Http::UploadedFile:0x10c986d60 @tempfile=#<File:/var/folders/bx/6z1z5yks56j40v15n43tjh1c0000gn/T/RackMultipart20130404-53101-bvdysw-0>,
@headers="Content-Disposition: form-data; name=\"image[picture][]\"; filename=\"bible-banner.png\"\r\nContent-Type: image/png\r\n",
@content_type="image/png",
@original_filename="bible-banner.png">],
"album_id"=>"10"},
"authenticity_token"=>"dr8GMCZOQo4dQKgkM4On2uMs8iORQ68vokjW0e4VvLY=",
"commit"=>"Submit",
"utf8"=>"✓",
"album_id"=>"10"}
控制器
class Admin::ImagesController < ApplicationController
respond_to :html, :json
def index
@album = Album.find(params[:album_id])
@images = @album.images.all
end
def new
@album = Album.find(params[:album_id])
@image = @album.images.new
#@image.picture.size.times {@image.build}
end
def create
@album = Album.find(params[:album_id])
@image = @album.images.new(params[:image])
if @image.save
flash[:notice] = "Successfully added image!"
redirect_to [:admin, @album, :images]
else
render 'new'
end
end
def show
@album = Album.find(params[:album_id])
@image = @album.images.find(params[:id])
end
def edit
@album = Album.find(params[:album_id])
@image = @album.images.find(params[:id])
end
def update
@album = Album.find(params[:album_id])
@image = @album.images.find(params[:id])
if @image.update_attributes(params[:image])
flash[:notice] = "Successfully updated Image"
redirect_to [:admin, @album, :images]
else
render "edit"
end
end
def destroy
@album = Album.find(params[:album_id])
@image = @album.images.find(params[:id])
@image.destroy
@albumid = @album.id
@id = @image.id
FileUtils.remove_dir("#{Rails.root}/public/uploads/image/picture/#{@albumid}/#{@id}", :force => true)
redirect_to admin_album_images_path(@album)
end
end
模型
class Image < ActiveRecord::Base
attr_accessible :title, :description, :picture, :image_id, :album_id, :albumcover, :image
belongs_to :album
accepts_nested_attributes_for :album
mount_uploader :picture, PictureUploader
end
表单视图
<%= form_for([:admin, :album, @image], :html => {:multipart => true}) do |f| %>
<%= f.hidden_field :album_id, :value => @album.id %>
<%= f.file_field :picture, :multiple => true %>
<%= f.submit "Submit" %>
<%end%>
上传者Carrierwave
class PictureUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
# include CarrierWave::MiniMagick
# Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
# include Sprockets::Helpers::RailsHelper
# include Sprockets::Helpers::IsolatedHelper
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.album_id}/#{model.id}"
end
end
答案 0 :(得分:3)
正如上面提到的一些评论者所说,你所拥有的是一个带有键picture
的散列(键/值对),其中值已经是一个数组,本质上它被分成不连续的对象。 / p>
要访问数组,您需要提供picture
密钥,然后您可以使用Array方法访问每个UploadedFile
。
首先从您的初始哈希开始:
hash_with_stuff = { "picture" => [#<UploadedFile1>,#<UploadedFile2>]}
#=> { "picture" => [#<UploadedFile1>,#<UploadedFile2>]}
为了获得数组:
array_of_pictures = hash_with_stuff["picture"]
#=> [#<UploadedFile1>,#<UploadedFile2>]
现在您拥有阵列,您可以像操作任何阵列一样对其进行操作:
# to get single elements out
array_of_pictures[0] # where the number is the index of the object in the array (starting with 0)
#=> #<UploadedFile1> #this is an UploadedFile object and will respond to its own methods
# to operate on each element with some method
array_of_pictures.each do |picture|
picture.create_thumbnail
end
这是否有意义或是否还有其他有关使用此问题的问题?
答案 1 :(得分:0)
让我们来看看这个哈希h = {“strings”=&gt; [“stirng_object_1”,“string_object_2”]}这几乎类似于你发布的哈希,除了数组中的对象是字符串而不是ActionDispatch :: Http :: UploadedFile对象。
所以从我引用的示例哈希,如果我必须得到第一个字符串对象,我会做
H [ “字符串”] [0]
同样,如果您想访问第一个ActionDispatch :: Http :: UploadedFile对象,您可以这样做(假设您的哈希名称为h)
H [ “图片”] [0]
答案 2 :(得分:0)
我想出了如何将此哈希请求拆分为单独的字符串。
图像控制器
def new
@album = Album.find(params[:album_id])
@image = @album.images.new
end
def create
params[:image][:picture].each do |image|
@album = Album.find(params[:album_id])
@params = {}
@params['picture'] = image
@image = @album.images.create(@params)
end
if @image.save
if params[:image][:picture].size > 1
flash[:notice] = "Successfully added images!"
else
flash[:notice] = "Successfully added image!"
end
redirect_to [:admin, @album, :images]
else
render "new"
flash[:notice] = "Did not successfully add image :("
end
end