我正在编写一个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
答案 0 :(得分:1)
您必须在CarrierWave中使用remove方法
@link = Link.first
@link.remove_picture!
@link.save