无法使用 CarrierWave 将 file-field 设置为 nil
Unable to set file-field to nil using CarrierWave
我正在编写一个 rails 5 应用程序,其中有一个名为 link 的 object,它有标题、url 和图片。图片为字符串类型,存储用户上传图片的路径。我想为用户提供删除此图像的选项,我在 links 控制器中设置了一个操作,但我试图将 'picture' 的值设置为 nil 但它没有执行任何操作.
这是 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 >
我可以将 link 的标题或 url 设置为 nil,但是对图片属性这样做没有任何作用。这是因为它是 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
不知道这是怎么回事。
更多详情:-
这是提交新的视图link。这是上传图片的地方:-
<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
必须使用 CarrierWave 中的 remove 方法
@link = Link.first
@link.remove_picture!
@link.save
我正在编写一个 rails 5 应用程序,其中有一个名为 link 的 object,它有标题、url 和图片。图片为字符串类型,存储用户上传图片的路径。我想为用户提供删除此图像的选项,我在 links 控制器中设置了一个操作,但我试图将 'picture' 的值设置为 nil 但它没有执行任何操作.
这是 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 >
我可以将 link 的标题或 url 设置为 nil,但是对图片属性这样做没有任何作用。这是因为它是 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
不知道这是怎么回事。
更多详情:-
这是提交新的视图link。这是上传图片的地方:-
<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
必须使用 CarrierWave 中的 remove 方法
@link = Link.first
@link.remove_picture!
@link.save