Rails 4:使用回形针上传多个图像

我希望将多个图像上传到我的“位置”模型。 我把图像称为“资产”。 一个位置有多个资产。 我也使用paperclip来处理上传和nested_form以允许选择多个资产。

奇怪的是,位置哈希看起来正确地传递变量,但它们似乎没有被资产模型拾取。 任何帮助都会很棒!

位置模型

class Location  :location_post has_many :assets, dependent: :destroy attr_accessor :asset, :assets_attributes accepts_nested_attributes_for :assets, :allow_destroy => true end 

资产模型

 class Asset  { :blurred => "600x300^",:large => "600x600>", :medium => "250x250^" , :thumb => "100x100^"}, #:source_file_options => {:all => '-rotate "-90>"'}, :convert_options => { :all => '-auto-orient', :blurred => "-blur 0x6 +repage -resize 600x300^" }, :storage => :s3, :s3_credentials => "#{Rails.root}/config/s3.yml", :bucket => "[bucketname]", :path => "/:style/:id/:filename" validates_attachment_content_type :asset, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"] end 

地点控制器

 class LocationsController < ApplicationController ... def new @location = Location.new @location.assets.build @georesult = Geocoder.search(params[:query]) end def create @location = Location.find_or_create_by(name: location_params[:name]) respond_to do |format| if @location.save format.html { redirect_to @location, notice: '  Great success! ' } format.json { render :show, status: :created, location: @location } else format.html { render :new } format.json { render json: @location.errors, status: :unprocessable_entity } end end end # PATCH/PUT /locations/1 # PATCH/PUT /locations/1.json def update respond_to do |format| if @location.update(location_params) format.html { redirect_to @location, notice: 'Location was successfully updated.' } format.json { render :show, status: :ok, location: @location } else format.html { render :edit } format.json { render json: @location.errors, status: :unprocessable_entity } end end end ... private # Use callbacks to share common setup or constraints between actions. def location_params params[:location].permit(:name, :notes, :longitude, :country, :latitude, :query, assets_attributes: [ :asset, :asset_content_type, :asset_file_name, :tempfile, :asset_file_size, :asset_updated_at, :_destroy]) end end 

表单视图

  {:multipart => true}) do |f| %> ...      ...  "btn btn-success submit_location" %>  

记录输出

 Processing by LocationsController#update as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"n4spoLjq4B3sZSJjqsGFRVjkseOwGgvquAHATBRG1Nk=", "location"=>{"name"=>"York", "notes"=>"", "lat itude"=>"53.96230079999999", "longitude"=>"-1.0818844", "country"=>"", "assets_attributes"=>{"0"=>{"asset"=>#<ActionDispatch::Http::UploadedFile :0x007ff739b7bb68 @tempfile=#, @original_filename= "78509.max1024.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"location[assets_attributes][0][asset]\"; filen ame=\"78509.max1024.jpg\"\r\nContent-Type: image/jpeg\r\n">, "_destroy"=>"false"}}}, "commit"=>"Submit", "id"=>"240"} User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 Location Load (0.4ms) SELECT "locations".* FROM "locations" WHERE "locations"."id" = $1 LIMIT 1 [["id", 240]] (0.2ms) BEGIN (0.3ms) COMMIT Redirected to http://localhost:3000/locations/240 Completed 302 Found in 9ms (ActiveRecord: 1.6ms) 

我在你的代码中看到了几个问题:

首先,您需要从Location模型中删除以下行:

 attr_accessor :asset, :assets_attributes 

作为其assetasset_attributes作为虚拟属性,这就是为什么它们不保存在数据库中。 此外,您不需要Location模型中的asset属性,因为它已由Asset模型处理。

然后,按照@Pavan的建议更新location_params

 def location_params ## Use `require` method params.require(:location).permit(:name, :notes, :longitude, :country, :latitude, :query, assets_attributes: [ :asset, :asset_content_type, :asset_file_name, :tempfile, :asset_file_size, :asset_updated_at, :_destroy]) end 

接下来,按如下所示更新create操作,以确保位置按名称唯一:

 def create @location = Location.find_by(name: location_params[:name]) unless @location @location = Location.new(location_params) end respond_to do |format| if @location.save format.html { redirect_to @location, notice: '  Great success! ' } format.json { render :show, status: :created, location: @location } else format.html { render :new } format.json { render json: @location.errors, status: :unprocessable_entity } end end end 

尝试使用<%= a.file_field :asset, :multiple=>"true",:name=>"location[assets][asset][]"%>来处理多个上传。

希望能帮助到你