Rails 4:使用回形针上传多张图片 [英] Rails 4: Multiple image upload using paperclip
问题描述
我希望将多张图片上传到位置"模型.我称图像模型为资产".一个地点有多个资产.我还使用回形针处理上传内容,并使用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
作为asset
和asset_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屋!