ruby-on-rails – 编辑具有以前成功上传图像的记录时,如何在编辑时不必重新上传?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 编辑具有以前成功上传图像的记录时,如何在编辑时不必重新上传?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Carrierwave,Fog将图像上传到S3.

问题是,当我去编辑一个记录时,“文件”和& “照片”字段自动变为空白.因此,如果我想保留记录中的图像或文件,我必须重新上传它.

否则,会发生什么是上传文件/图像消失了.我甚至不确定它是否从S3中删除,但与我在db中的记录的关联消失了.

这是我的Post模型的SimpleForm _form.html.erb partial:

  1. <%= simple_form_for(@post,html: {class: 'form-horizontal' }) do |f| %>
  2. <%= f.error_notification %>
  3. <%= f.input_field :title,placeholder: "Enter Title" %>
  4. <%= f.input_field :body,id: "body-field",placeholder: "Provide all the facts." %>
  5. <%= f.input_field :photo %>
  6. <%= f.input_field :file %>
  7. <%= f.button :submit,class: "btn btn-primary pull-left" %>
  8. <% end %>

这是我的PhotoUploader

  1. class PhotoUploader < CarrierWave::Uploader::Base
  2. include CarrierWave::RMagick
  3. storage :fog
  4.  
  5. include CarrierWave::MimeTypes
  6. process :set_content_type
  7.  
  8. def store_dir
  9. "images/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  10. end
  11.  
  12. version :main_thumb_mobile do
  13. process :resize_to_fit => [52,52]
  14. end
  15.  
  16. version :main_thumb do
  17. process :resize_to_fit => [150,150]
  18. end
  19.  
  20. version :post_thumb do
  21. process :resize_to_fit => [200,200]
  22. end
  23.  
  24. version :large do
  25. process :resize_to_limit => [400,400]
  26. end
  27.  
  28. def extension_white_list
  29. %w(jpg jpeg gif png)
  30. end
  31. end

这是我的FileUploader

  1. class FileUploader < CarrierWave::Uploader::Base
  2. storage :fog
  3. def store_dir
  4. "files/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  5. end
  6.  
  7. def extension_white_list
  8. %w(pdf doc docx xls xlsx ppt pptx txt mp4 m4v mov avi mkv mp3 wav)
  9. end
  10. end

这是我的帖子的架构:

  1. # == Schema Information
  2. # truncated for brevity
  3. # Table name: posts
  4. #
  5. # id :integer not null,primary key
  6. # title :text
  7. # photo :string(255)
  8. # body :text
  9. # user_id :integer
  10. # file :string(255)

编辑1

这是我的Post.rb:

  1. # == Schema Information
  2. #
  3. # Table name: posts
  4. #
  5. # id :integer not null,primary key
  6. # title :text
  7. # photo :string(255)
  8. # body :text
  9. # created_at :datetime
  10. # updated_at :datetime
  11. # user_id :integer
  12. # ancestry :string(255)
  13. # file :string(255)
  14. # status :integer default(0)
  15. # slug :string(255)
  16. # publication_status :integer default(0)
  17. # has_eyewitness :boolean default(FALSE)
  18. # youtube_embed_code :text
  19. # soundcloud_embed_code :text
  20. #
  21.  
  22. class Post < ActiveRecord::Base
  23. has_ancestry
  24. belongs_to :user
  25. resourcify
  26. enum status: [ :unconfirmed,:corroborated,:confirmed ]
  27. enum publication_status: [ :unpublished,:published ]
  28. extend FriendlyId
  29. friendly_id :title,use: [:slugged,:history,:finders]
  30.  
  31. attr_accessor :country
  32.  
  33. mount_uploader :photo,PhotoUploader
  34. mount_uploader :file,FileUploader
  35.  
  36. validates_presence_of :body
  37. validates_length_of :body,maximum: 150,too_long: 'The report must be less than 150 words.',tokenizer: ->(str) { str.scan(/\w+/) }
  38. validates_length_of :title,maximum: 7,too_long: 'The title must be less than 7 words.',tokenizer: ->(str) { str.scan(/\w+/) }
  39.  
  40. def publish
  41. published!
  42. end
  43.  
  44. def unpublish
  45. unpublished!
  46. end
  47.  
  48. def is_published?
  49. if self.published?
  50. "yes"
  51. else
  52. "no"
  53. end
  54. end
  55. end

编辑2

我将f.input_field:我的表单中的照片更改为f.file_field:照片按照jaspreet的建议,它仍然无法正常工作.这是我更新请求的日志:

  1. 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
  2. Processing by PostsController#update as HTML
  3. 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"}
  4. User Load (1.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
  5. (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. (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]]
  7. (0.2ms) BEGIN
  8. 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
  9. 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",""]]
  10. 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"]]
  11. 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"]]
  12. 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"]]
  13. (2.6ms) COMMIT
  14. Redirected to http://localhost:3000/posts/ognr-takes-over-amcham-cd491a8e-9a4e-4d5e-b13a-898de4adf135
  15. Completed 302 Found in 372ms (ActiveRecord: 17.3ms)

编辑3

PostController#Update看起来像这样:

  1. class PostsController < ApplicationController
  2. load_and_authorize_resource
  3.  
  4. def update
  5. respond_to do |format|
  6. if @post.update(post_params)
  7. format.html { redirect_to @post,notice: 'Report was successfully updated.' }
  8. format.json { render :show,status: :ok,location: @post }
  9. else
  10. format.html { render :edit }
  11. format.json { render json: @post.errors,status: :unprocessable_entity }
  12. end
  13. end
  14. end

编辑4

解决方法

您需要使用上传图像的输入字段来显示图像名称,并使用javascript函数在输入字段中显示文件名,如下所示:
  1. <%= text_field_tag 'file_name',"#{@post.photo_file_name}",{disabled: true,class: 'browse-input form-control'} %>
  2. <%= f.input_field :photo %>
  3. :javascript
  4. $("#post_photo").change(function () {
  5. $("#file_name").val(this.value.replace(/^.*[\\\/]/,''));
  6. });

并且您可以使用相同的代码上传文件.

用于防止重新上传未更改的照片

您可以使用changed?方法检查照片是否更改,如下所示:

  1. def update
  2. if @post.photo && !@post.photo.changed?
  3. @post.update(post_update_params_without_photo)
  4. end
  5. end
  6. # Example method,don't forgot set the necessary attributes
  7. def post_update_params_without_photo
  8. params.require(:post).permit(:title)
  9. end

说明:此代码仅更新已更改的属性,即(标题,状态等).

猜你在找的Ruby相关文章