Rails 4:使用回形针上传多张图片 [英] Rails 4: Multiple image upload using paperclip

查看:84
本文介绍了Rails 4:使用回形针上传多张图片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望将多张图片上传到位置"模型.我称图像模型为资产".一个地点有多个资产.我还使用回形针处理上传内容,并使用nested_form允许选择多个资产.

I'm looking to upload multiple images to my 'locations' model. I've called the images model 'assets'. One location has multiple assets. I'm also using paperclip to handle the uploads and nested_form to allow selecting multiple assets.

奇怪的是,位置哈希值似乎正确传递了变量,但是资产模型似乎没有选择它们.任何帮助都会很棒!

Weirdly, the locations hash looks to be passing the variables correctly, but they don't appear to be being picked up by the assets model. Any help would be great!

位置模型

class Location < ActiveRecord::Base

  has_many :location_post
  has_many :posts, :through => :location_post  
  has_many :assets, dependent: :destroy

  attr_accessor :asset, :assets_attributes
  accepts_nested_attributes_for :assets, :allow_destroy => true 
end

资产模型

class Asset < ActiveRecord::Base

   belongs_to :location

   has_attached_file :asset,
                    :styles => {
                      :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: ' <borat voice> Great success! </borat voice>' }
       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

表单视图

<%= nested_form_for(@location, :html=> {:multipart => true}) do |f| %>

...

  <%= f.fields_for :assets do |a| %>
    <%= a.file_field :asset %>
    <%= a.link_to_remove "Remove this image" %>
  <% end %>
<%= f.link_to_add "Add an image", :assets %>

...

    <%= f.submit "Submit", :class => "btn btn-success submit_location" %>

<% end %>

日志输出

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=#<Tempfile:/var/folders/sc/gps8hkgj7yg31j81gpnfg9h00000gn/T/RackMultipart20140706-43312-kdpghs>, @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)

推荐答案

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

I see couple of problems in your code:

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

First thing, you need to remove the following line from Location model:

attr_accessor :asset, :assets_attributes

作为assetasset_attributes作为虚拟属性,这就是为什么它们不保存在数据库中的原因.另外,您不必在Location模型中使用asset属性,因为Asset模型会注意该属性.

as its making asset and asset_attributes as virtual attributes which is why they are not saved in database. Also, you don't need asset attribute in Location model as its been taken care by Asset model.

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

Then, update the location_params as suggested by @Pavan:

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操作,以确保位置在名称上是唯一的:

Next, update the create action as below to ensure Locations are unique by name:

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: ' <borat voice> Great success! </borat voice>' }
      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 

这篇关于Rails 4:使用回形针上传多张图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆