Rails 4:使用回形针上传多张图片

编程入门 行业动态 更新时间:2024-10-20 03:45:34
本文介绍了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 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:使用回形针上传多张图片

本文发布于:2023-11-26 02:52:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1632345.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:回形针   多张   上传   图片   Rails

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!