我正在使用Carrierwave,Fog将图像上传到S3.
问题是,当我去编辑一个记录时,“文件”和& “照片”字段自动变为空白.因此,如果我想保留记录中的图像或文件,我必须重新上传它.
否则,会发生什么是上传的文件/图像消失了.我甚至不确定它是否从S3中删除,但与我在db中的记录的关联消失了.
这是我的Post模型的SimpleForm _form.html.erb partial:
- <%= simple_form_for(@post,html: {class: 'form-horizontal' }) do |f| %>
- <%= f.error_notification %>
- <%= f.input_field :title,placeholder: "Enter Title" %>
- <%= f.input_field :body,id: "body-field",placeholder: "Provide all the facts." %>
- <%= f.input_field :photo %>
- <%= f.input_field :file %>
- <%= f.button :submit,class: "btn btn-primary pull-left" %>
- <% end %>
这是我的PhotoUploader
- class PhotoUploader < CarrierWave::Uploader::Base
- include CarrierWave::RMagick
- storage :fog
- include CarrierWave::MimeTypes
- process :set_content_type
- def store_dir
- "images/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
- end
- version :main_thumb_mobile do
- process :resize_to_fit => [52,52]
- end
- version :main_thumb do
- process :resize_to_fit => [150,150]
- end
- version :post_thumb do
- process :resize_to_fit => [200,200]
- end
- version :large do
- process :resize_to_limit => [400,400]
- end
- def extension_white_list
- %w(jpg jpeg gif png)
- end
- end
这是我的FileUploader
- class FileUploader < CarrierWave::Uploader::Base
- storage :fog
- def store_dir
- "files/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
- end
- def extension_white_list
- %w(pdf doc docx xls xlsx ppt pptx txt mp4 m4v mov avi mkv mp3 wav)
- end
- end
这是我的帖子的架构:
- # == Schema Information
- # truncated for brevity
- # Table name: posts
- #
- # id :integer not null,primary key
- # title :text
- # photo :string(255)
- # body :text
- # user_id :integer
- # file :string(255)
编辑1
这是我的Post.rb:
- # == Schema Information
- #
- # Table name: posts
- #
- # id :integer not null,primary key
- # title :text
- # photo :string(255)
- # body :text
- # created_at :datetime
- # updated_at :datetime
- # user_id :integer
- # ancestry :string(255)
- # file :string(255)
- # status :integer default(0)
- # slug :string(255)
- # publication_status :integer default(0)
- # has_eyewitness :boolean default(FALSE)
- # youtube_embed_code :text
- # soundcloud_embed_code :text
- #
- class Post < ActiveRecord::Base
- has_ancestry
- belongs_to :user
- resourcify
- enum status: [ :unconfirmed,:corroborated,:confirmed ]
- enum publication_status: [ :unpublished,:published ]
- extend FriendlyId
- friendly_id :title,use: [:slugged,:history,:finders]
- attr_accessor :country
- mount_uploader :photo,PhotoUploader
- mount_uploader :file,FileUploader
- validates_presence_of :body
- validates_length_of :body,maximum: 150,too_long: 'The report must be less than 150 words.',tokenizer: ->(str) { str.scan(/\w+/) }
- validates_length_of :title,maximum: 7,too_long: 'The title must be less than 7 words.',tokenizer: ->(str) { str.scan(/\w+/) }
- def publish
- published!
- end
- def unpublish
- unpublished!
- end
- def is_published?
- if self.published?
- "yes"
- else
- "no"
- end
- end
- end
编辑2
我将f.input_field:我的表单中的照片更改为f.file_field:照片按照jaspreet的建议,它仍然无法正常工作.这是我更新请求的日志:
- Started PATCH "/posts/ognr-takes-over-amcham-6a6f01ba-a9f9-44d5-924a-72f666f20ca8" for 127.0.0.1 at 2014-12-28 13:51:38 -0500
- Processing by PostsController#update as HTML
- Parameters: {"utf8"=>"✓","authenticity_token"=>"S7FOq956fox6XYpar7Yd6V7AL+bwypQQxZktjHW3PNc=","post"=>{"parent_id"=>"","status"=>"unconfirmed","publication_status"=>"unpublished","title"=>"OGNR takes over AMCHAM","body"=>"OGNR storms the rerl.","has_eyewitness"=>"1","youtube_embed_code"=>"","soundcloud_embed_code"=>""},"commit"=>"Update Post","id"=>"ognr-takes-over-amcham-6a6f01ba-a9f9-44d5-924a-72f666f20ca8"}
- User Load (1.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
- (1.2ms) SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id",1]]
- (6.4ms) SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'editor') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id",1]]
- (0.2ms) BEGIN
- Post Exists (1.0ms) SELECT 1 AS one FROM "posts" INNER JOIN "friendly_id_slugs" ON "friendly_id_slugs"."sluggable_id" = "posts"."id" AND "friendly_id_slugs"."sluggable_type" = 'Post' WHERE ("posts"."id" IS NOT NULL) AND "posts"."slug" = 'ognr-takes-over-amcham' LIMIT 1
- sql (0.6ms) INSERT INTO "posts" ("body","created_at","has_eyewitness","slug","soundcloud_embed_code","title","updated_at","youtube_embed_code") VALUES ($1,$2,$3,$4,$5,$6,$7,$8) RETURNING "id" [["body","OGNR storms the rerl."],["created_at","2014-12-28 18:51:39.183091"],["has_eyewitness","t"],["slug","ognr-takes-over-amcham-cd491a8e-9a4e-4d5e-b13a-898de4adf135"],["soundcloud_embed_code",""],["title","OGNR takes over AMCHAM"],["updated_at",["youtube_embed_code",""]]
- FriendlyId::Slug Load (0.5ms) SELECT "friendly_id_slugs".* FROM "friendly_id_slugs" WHERE "friendly_id_slugs"."sluggable_id" = $1 AND "friendly_id_slugs"."sluggable_type" = $2 ORDER BY "friendly_id_slugs".id DESC LIMIT 1 [["sluggable_id",43],["sluggable_type","Post"]]
- sql (0.4ms) DELETE FROM "friendly_id_slugs" WHERE "friendly_id_slugs"."sluggable_id" = $1 AND "friendly_id_slugs"."sluggable_type" = $2 AND "friendly_id_slugs"."slug" = 'ognr-takes-over-amcham-cd491a8e-9a4e-4d5e-b13a-898de4adf135' [["sluggable_id","Post"]]
- sql (0.4ms) INSERT INTO "friendly_id_slugs" ("created_at","sluggable_id","sluggable_type") VALUES ($1,$4) RETURNING "id" [["created_at","2014-12-28 18:51:39.242475"],["sluggable_id","Post"]]
- (2.6ms) COMMIT
- Redirected to http://localhost:3000/posts/ognr-takes-over-amcham-cd491a8e-9a4e-4d5e-b13a-898de4adf135
- Completed 302 Found in 372ms (ActiveRecord: 17.3ms)
编辑3
PostController#Update看起来像这样:
- class PostsController < ApplicationController
- load_and_authorize_resource
- def update
- respond_to do |format|
- if @post.update(post_params)
- format.html { redirect_to @post,notice: 'Report was successfully updated.' }
- format.json { render :show,status: :ok,location: @post }
- else
- format.html { render :edit }
- format.json { render json: @post.errors,status: :unprocessable_entity }
- end
- end
- end
编辑4
解决方法
您需要使用上传图像的输入字段来显示图像名称,并使用javascript函数在输入字段中显示文件名,如下所示:
- <%= text_field_tag 'file_name',"#{@post.photo_file_name}",{disabled: true,class: 'browse-input form-control'} %>
- <%= f.input_field :photo %>
- :javascript
- $("#post_photo").change(function () {
- $("#file_name").val(this.value.replace(/^.*[\\\/]/,''));
- });
用于防止重新上传未更改的照片
- def update
- if @post.photo && !@post.photo.changed?
- @post.update(post_update_params_without_photo)
- end
- end
- # Example method,don't forgot set the necessary attributes
- def post_update_params_without_photo
- params.require(:post).permit(:title)
- end