我正在使用Rails4和Carrierwave来上传文件,并且我正在使用它。 我来看看这个作品的尺寸,2. Model Level Validation。Rails4:如何验证carrierwave上传的图片大小?
我在models \ article.rb中添加了validate :image_size_validation
,但出现了NoMethodError in ArticlesController#create
。
如何检查图像大小?
我是否应该使用file_size_validator.rb
(请参阅How to: Validate attachment file size)而不是上述文章中的解决方案?
任何想法?提前致谢。
\型号\ article.rb
class Article < ActiveRecord::Base
...
has_many :photos, dependent: :destroy
validate :image_size_validation
...
private
def image_size_validation
errors[:image] << "should be less than 1MB" if photos.image.size > 1.megabytes
end
end
\型号\ photo.rb
class Photo < ActiveRecord::Base
belongs_to :article
mount_uploader :image, ImageUploader
end
\控制器\ article_controller.rb
...
def create
@article = current_user.articles.build(article_params)
if @article.save
flash[:success] = "article created!"
redirect_to current_user #root_url
else
@article.build_images
render 'new'
end
end
...
文章表
sqlite> .schema articles
CREATE TABLE "articles" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "content" varchar(255),"user_id" integer, "created_at" datetime, "updated_at" datetime, "category_id" integer);
照片表
sqlite> .schema photos
CREATE TABLE "photos" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "article_id" integer,"image" varchar(255), "created_at" datetime, "updated_at" datetime, "bin_image" blob); #prepare bin_image for saving image as binary
development.log
Started POST "/articles" for 127.0.0.1 at 2014-10-08 19:47:05 +0900
Processing by ArticlesController#create as HTML
Parameters: {"utf8"=>"笨・, "authenticity_token"=>"xxx", "article"=>{"category_id"=>"1718", "photos_attributes"=>{"0"=>{"article_id"=>"", "image"=>#<ActionDispatch::Http::UploadedFile:0x4579140 @tempfile=#<File:C:/xxx/AppData/Local/Temp/RackMultipart20141008-5252-vsv6z>, @original_filename="DSCN0721_080.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"article[photos_attributes][0][image]\"; filename=\"DSCN0721_080.JPG\"\r\nContent-Type: image/jpeg\r\n">}, "1"=>{"article_id"=>""}, "2"=>{"article_id"=>""}}, "content"=>"test"}, "commit"=>"逋サ骭イ縺吶k"}
[1m[35mUser Load (0.0ms)[0m SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'xxx' LIMIT 1
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
[1m[35m (0.0ms)[0m rollback transaction
Completed 500 Internal Server Error in 888ms
NoMethodError (undefined method `image' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Photo:0x472f8d8>):
app/models/article.rb:27:in `image_size_validation'
app/controllers/articles_controller.rb:20:in `create'
编辑
我photo.rb代替article.rb添加image_size_validation
,但是当我上传出现错误消息超过1MB的图像。
\型号\ photo.rb
class Photo < ActiveRecord::Base
belongs_to :article
mount_uploader :image, ImageUploader
validate :image_size_validation
private
def image_size_validation
#errors[:image] << "should be less than xMB" if image.size > 1.megabytes
#add the following code instead of above line
if image.size > 1.megabytes
errors.add(:base, "Image should be less than 1MB")
end
end
end
\日志\ development.log
Started POST "/articles" for 127.0.0.1 at 2014-10-11 05:50:06 +0900
Processing by ArticlesController#create as HTML
Parameters: {"utf8"=>"笨・, "authenticity_token"=>"xxxx", "article"=>{"categort_id"=>"1718", "photos_attributes"=>{"0"=>{"article_id"=>"", "image"=>#<ActionDispatch::Http::UploadedFile:0x43af760 @tempfile=#<File:C:/xxxx/AppData/Local/Temp/xxxxk>, @original_filename="DSCN0721.JPG", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"article[photos_attributes][0][image]\"; filename=\"DSCN0721.JPG\"\r\nContent-Type: image/jpeg\r\n">}, "1"=>{"article_id"=>""}, "2"=>{"article_id"=>""}}, "content"=>"test"}, "commit"=>"逋サ骭イ縺吶k"}
[1m[35mUser Load (0.0ms)[0m SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'xxxx' LIMIT 1
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
[1m[35mSQL (3.0ms)[0m INSERT INTO "articles" ("content", "created_at", "category_id", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?) [["content", "test"], ["created_at", Fri, 10 Oct 2014 20:50:08 UTC +00:00], ["category_id", 1718], ["updated_at", Fri, 10 Oct 2014 20:50:08 UTC +00:00], ["user_id", 1]]
Binary data inserted for `string` type on column `image`
[1m[36mSQL (1.0ms)[0m [1mINSERT INTO "photos" ("article_id", "created_at", "image", "updated_at") VALUES (?, ?, ?, ?)[0m [["article_id", 78], ["created_at", Fri, 10 Oct 2014 20:50:08 UTC +00:00], ["image", "xxxx.jpg"], ["updated_at", Fri, 10 Oct 2014 20:50:08 UTC +00:00]]
[1m[35m (3.0ms)[0m commit transaction
Redirected to http://localhost:3000/users/1
Completed 302 Found in 1306ms (ActiveRecord: 7.0ms)
应验证文件的大小在'Photo'模型,向人们展示它的工作,你总是可以做'把“林验证”'在'image_size_validation'方法,然后看看你的控制台看到它工作 – Richlewis 2014-10-08 13:38:16
感谢您的评论,@Richlewis。我编辑了我的问题。我在照片模型中添加了“验证”,但无法验证。我不明白'提出'我正在验证''。不胜感激,如果你可以更具体一点。 – SamuraiBlue 2014-10-09 13:05:17
你怎么输出你的错误信息? – Richlewis 2014-10-09 13:06:59