无法使用CarrierWave将文件字段设置为nil

时间:2017-06-05 10:28:04

标签: ruby-on-rails carrierwave

我正在编写一个rails 5应用程序,其中我有一个名为link的对象,其中包含标题,网址和图片。图片为字符串类型,并存储用户上传的图片的路径。我想让用户选择删除此图像,我在链接控制器中设置了一个操作,但我试图设置'图片'没有,但它没有做任何事情。

这是rails控制台的输出: -

2.4.0 :007 > link = Link.first
  Link Load (0.4ms)  SELECT  "links".* FROM "links" ORDER BY "links"."created_at" DESC LIMIT ?  [["LIMIT", 1]]
 => #<Link id: 20, title: "large", url: "http://www.large.com", user_id: 12, created_at: "2017-06-05 07:59:03", updated_at: "2017-06-05 10:20:30", picture: "dummy5.jpg"> 
2.4.0 :008 > link.picture
 => #<PictureUploader:0x00000002df4ab0 @model=#<Link id: 20, title: "large", url: "http://www.large.com", user_id: 12, created_at: "2017-06-05 07:59:03", updated_at: "2017-06-05 10:20:30", picture: "dummy5.jpg">, @mounted_as=:picture, @storage=#<CarrierWave::Storage::File:0x00000002df44e8 @uploader=#<PictureUploader:0x00000002df4ab0 ...>>, @file=#<CarrierWave::SanitizedFile:0x00000002ddf9d0 @file="/home/ryarasi/rails/practice/raddit/public/uploads/link/picture/20/dummy5.jpg", @original_filename=nil, @content_type=nil>, @versions={}> 
2.4.0 :009 > link.picture=nil
 => nil 
2.4.0 :010 > link
 => #<Link id: 20, title: "large", url: "http://www.large.com", user_id: 12, created_at: "2017-06-05 07:59:03", updated_at: "2017-06-05 10:20:30", picture: "dummy5.jpg"> 
2.4.0 :011 > link.update_attributes(picture:nil)
   (0.1ms)  begin transaction
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 12], ["LIMIT", 1]]
  Link Load (0.1ms)  SELECT  "links".* FROM "links" WHERE "links"."id" = ? ORDER BY "links"."created_at" DESC LIMIT ?  [["id", 20], ["LIMIT", 1]]
  SQL (1.2ms)  UPDATE "links" SET "updated_at" = ?, "picture" = ? WHERE "links"."id" = ?  [["updated_at", "2017-06-05 10:21:15.623761"], ["picture", "dummy5.jpg"], ["id", 20]]
   (48.1ms)  commit transaction
 => true 
2.4.0 :012 > link
 => #<Link id: 20, title: "large", url: "http://www.large.com", user_id: 12, created_at: "2017-06-05 07:59:03", updated_at: "2017-06-05 10:21:15", picture: "dummy5.jpg"> 
2.4.0 :013 > link.picture
 => #<PictureUploader:0x00000002df4ab0 @model=#<Link id: 20, title: "large", url: "http://www.large.com", user_id: 12, created_at: "2017-06-05 07:59:03", updated_at: "2017-06-05 10:21:15", picture: "dummy5.jpg">, @mounted_as=:picture, @storage=#<CarrierWave::Storage::File:0x00000002df44e8 @uploader=#<PictureUploader:0x00000002df4ab0 ...>>, @file=#<CarrierWave::SanitizedFile:0x00000002ddf9d0 @file="/home/ryarasi/rails/practice/raddit/public/uploads/link/picture/20/dummy5.jpg", @original_filename=nil, @content_type=nil>, @versions={}> 
2.4.0 :014 > 

我可以将链接的标题或网址设置为nil,但是对图片属性这样做并不能做任何事情。这是因为它是一个file_field而标题和网址只是字符串吗?

此外,这里是schema.rb,其中picture实际上设置为字符串: -

  create_table "links", force: :cascade do |t|
    t.string   "title"
    t.string   "url"
    t.integer  "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string   "picture"
    t.index ["user_id"], name: "index_links_on_user_id"
  end

不知道该怎么做。

更多详情: -

这是提交新链接的视图。这是图片上传的地方: -

<h1>Submit Link</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">

    <%= form_for(@link, url: link_path) do |f| %>
      <%= render partial: 'shared/error_messages',
                 locals: {object: @link} %>

      <%= f.label :title %>
      <%= f.text_field :title, class: 'form-control' %>

      <%= f.label :url %>
      <%= f.text_field :url, class: 'form-control' %>

      <%= f.label :picture %>
      <%= f.file_field :picture,
          accept: 'image/jpeg, image/png, image/gif',
          class: 'form-control' %>

      <%= f.submit "Submit link", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

<script type="text/javascript">
  $('#micropost_picture').bind('change', function() {
    var size_in_megabytes = this.files[0].size/1024/1024;
    if (size_in_megabytes > 5) {
      alert('Maximum file size is 5MB. Please choose a smaller file.');
    }
  });
</script>

link.rb: -

class Link < ApplicationRecord

  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :title, presence: true
  validates :url, presence: true
  validates :user_id, presence: true
  validate :picture_size
  after_destroy :delete_empty_upload_directory

  def picture_size
    if picture.size > 5.megabytes
      errors.add(:picture, "Should be less than 5MB")
    end
  end

  private

    def delete_empty_upload_directory
      FileUtils.rm_rf(Rails.root.join('public', 'uploads', 'link', 'picture',
                                      self.id.to_s)) if self.picture
    end
end

1 个答案:

答案 0 :(得分:1)

您必须在CarrierWave中使用remove方法

@link = Link.first
@link.remove_picture!
@link.save