2017-06-05 34 views
0

我正在寫一個rails 5應用程序,其中有一個名爲鏈接的對象,其中包含標題,網址和圖片。圖片是字符串類型的,並存儲用戶上傳圖片的路徑。我想給用戶刪除這個圖像的選項,並且我在鏈接控制器中設置了一個動作,但是我試圖將'圖片'的值設置爲零,但是它沒有做任何事情。無法使用CarrierWave將文件字段設置爲零

下面是從鐵軌控制檯輸出: -

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 > 

我能夠設置標題或鏈接到零的網址,但這樣做的圖片屬性沒有做任何事情。這是因爲它是一個file_field,而標題和url只是字符串?

而且,這裏的地方畫面實際上是設置爲一個字符串schema.rb: -

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 

回答

0

您必須使用remove方法CarrierWave

@link = Link.first 
@link.remove_picture! 
@link.save 
相關問題